2008-12-18 32 views
2

當我將不可變類型的對象(String,Integer,..)作爲final傳遞給一個方法時,我可以實現C++常量指針的字符。但是我怎樣才能在可變的對象中執行這樣的行爲呢?如何獲得在Java中等價的C++常量指針?

public void someMethod(someType someObject){ 
/* 
    * code that modifies the someObject's state 
    * 
    */ 
} 

我想要的是防止someMethod修改someObject的狀態,而不會在someType中做任何改變。這可能嗎?

回答

1

不,我不認爲這是可能的。常規方法是爲SomeType創建一個適配器,其中所有更改狀態的方法都會引發UnsupportedOperationException。這由例如java.util.Collections.unmodifiable * -functions使用。

有幾種方法,以這樣的:

  • 可以讓SOMETYPE是一個接口,而當你需要它爲只讀,只創建一個包裝委託所有的讀法原來的對象和實現所有的寫入方法來拋出異常。
  • ,或者可以創建SOMETYPE的覆蓋所有的寫入方法的子類

當然,這隻會給你運行時檢查,而不是編譯時。如果你想編譯時,你可以讓SOMETYPE是沒有寫方法的接口(或超類),只讀。

2

不,您無法通過其setXXX()(或類似的)方法阻止對象被修改。不過,你可以交出一份克隆或其副本。

+0

但克隆的是,我不想要真正巨大的物體做這樣一個昂貴的選擇 – 2008-12-18 13:24:14

+0

好,然後包裝是他們唯一的選擇留給你。 – Bombe 2008-12-18 13:32:18

1

不,這是不可能的。您必須傳遞對象的副本,或者只需知道哪些操作會對對象進行狀態更改並避免調用它們 - 編譯器不會幫助您。

5

在一般情況下,不,這是不可能的。在非常有限的情況下,可以將someType包裝在提供相同接口的類中(例如,請參閱Collections.unmodifiableList())。

但是,沒有等價於「傳遞一個const指針,編譯器只允許你調用const函數」。