2012-09-17 27 views
3

也許我仍然錯過了一個重要的概念。Java類似於「C++:const返回類型」 - 或者如何允許讀取和防止寫入非原始成員

爲了允許讀取和防止寫入非原始成員,相應的getter總是創建成員對象的新副本。出於性能原因,我想防止這種情況發生。我正在嘗試編寫一個簡單的基於四叉樹的碰撞檢測2D模擬器,這將是麪包和黃油。

我想在C++中,我可以用const的返回來完成它。 (我知道我可以用劇組覆蓋這個),但我不確定這是如何在JAVA中完成的。

有什麼想法?

+1

[Java是否有一個const引用等效?](http://stackoverflow.com/questions/2152285/does-java-have-a-const-reference-equivalent?rq=1) – Baz

回答

2

您可以自由使任何自定義引用類型不可變。

你是說你克隆每個對象?你可能有堆問題。我更喜歡不可變的解決方案。它是線程安全的並且佔用更少的內存。

對於C++返回const,Java沒有語言支持。你可以返回不可修改的集合,但你的類必須進行適當的編碼才能得到你想要的行爲。

1

的根據吸氣總是創建成員對象

在理論上是的,在實踐中,這是無法保證的新副本,並通常會被優化掉。

我想防止出於性能原因。

如果你來自C++,你可能會發現,很多人都擔心C++不是Java的一個問題的問題(反之亦然)


如果你考慮到JIT會優化掉所有簡單的getter,所以沒有性能開銷,你可能會發現以下的簡單形式是你所需要的。

private int x; // non-final so it can be changed 
// or better 
private final int x; // makes it clear the field will not be changed. 

public int getX() { return x; } 

使用final或不使用的區別不在於性能,而在於清晰度。

3

有幾種方法可以將您想要執行的操作歸檔。

首先沒有語言支持什麼const在C++中所做的。

在任何情況下,我建議你使用Getters和Setters,因爲它們不會造成任何開銷。 Java即時優化可以解決這個問題。

對於非原始類型,您仍然存在您返回的對象本身可能發生更改的問題。有三種方法可以防止這種情況發生。

  1. 根本不返回對象。您可以通過父對象中的多個獲取器來提供存儲在對象內部的數據。
  2. 您使用不可變對象或不可變視圖。因此,一般而言無法更改的對象或僅提供對象視圖但阻止設置對象的對象。
  3. 您使用克隆或複製構造函數返回原始對象的副本。
相關問題