![](/img/trans.png)
[英]How can i create a method that modifies an object of another class(java)?
[英]How to determine if a Java method modifies an object passed as parameter
我來自C ++背景,目前我正在學習Java。 當我嘗試使用某些第三方庫時出現了一個問題。 如何確定對作為參數的對象引用的方法的調用是否修改了對象? 在C ++中,由於使用了const關鍵字,因此很清楚。 如果方法簽名是:
void foo(Boo& boo);
我知道引用的對象可能會被修改,而如果方法簽名是:
void foo(const Boo& boo);
編譯器保證不會修改引用的對象。
我沒有在Java中看到類似的東西,因為只有引用本身可以被聲明為final,而不是引用的對象,並且最終的參數在第一個地方沒有多大意義,因為它無論如何都是通過值傳遞的。 因此,當我看到一個方法,如:
void foo(Boo boo) {...}
如何確定boo引用的對象是否在函數體內修改(可能使用注釋)? 如果沒有辦法知道,是否有一些廣泛使用的約定或一些最佳實踐來避免混淆和錯誤?
如何確定boo引用的對象是否在函數體內修改(可能使用注釋)?
唯一的方法是不幸地讀取代碼。
如果沒有辦法知道,是否有一些廣泛使用的約定或一些最佳實踐來避免混淆和錯誤?
常見的慣例是在需要時使用包裝器傳遞無法修改的對象。 這樣可以確保類無法修改對象。
List<String> readOnly = Collections.unmodifiableList(list);
如果對象是Cloneable,您也可以使用clone()
但另一種常見方法是使用副本。
List<String> readOnly = new ArrayList<>(list);
如果您關心此類行為,單元測試可以顯示方法是否修改了對象。 如果您已經進行了單元測試,通常需要一兩行來檢查。
不幸的是,這種語言沒有內置這種設施。 一個好的防御性做法是將您傳遞的數據對象定義為不可變的(即,沒有任何允許修改其狀態的公共方法)。 如果你真的關心這個問題,你可以在將對象傳遞給你不信任的方法之前復制/克隆一個對象,但這通常是一個多余的預防措施。
注意:這個答案是更詳細的版本
在編譯時可以通過注釋檢查的各種事物之間存在Checker Framework是IJG Immutablity檢查器 。 此檢查器允許您使用@Immutable
或@ReadOnly
注釋對象引用。
問題是您經常需要自己注釋庫 。 為了簡化您的任務,Checker Framework可以自動推斷部分注釋; 你仍然需要自己做很多事情。
如何確定boo引用的對象是否在函數體內修改(可能使用注釋)?
我必須同意其他答案,沒有直接的方法來確定該方法是否會修改您的對象,是的,以確保該方法無法修改您的Object
您必須做的就是在您身邊。
如果沒有辦法知道,是否有一些廣泛使用的約定或一些最佳實踐來避免混淆和錯誤?
這里方法名稱出現在場景中。 繼續使用方法的命名約定,我們必須查看一些方法聲明,這些聲明明確地說服了您的Object
根本不會被更改。
例如,你知道Arrays.copyOf
不會改變你的實際數組, System.out.println(boo)
不會改變你的boo
方法名稱是真正的武器 ,可以為方法用戶提供盡可能多的信息。 (是的!這總是不可能,但要遵循相當不錯的做法。)
讓我們考慮在你的情況下說printBoo
只會打印, copyBoo
只會復制, clearBoo
會重置所有屬性, checkAndCreateNewBoo
會檢查你的boo
Object
並在需要時創建新的。
因此,最終,如果我們能以適當的方式調用者使用他們可以用事實放心Object
會調用該方法后保持不變。
正如大家所說,更喜歡使用不可變對象,也避免使用void方法
這樣的方法的可用目的
void foo(Boo boo) {...}
是更改對象本身的狀態或更改作為參數傳遞的對象
void completOrder(Order order) { ... }
//or
void parserTokenEnded(String str) { ... }
有一種方法,方法開發人員應將參數標記為final,如果它不打算修改參數。
public void test(final Object param)
然而,很少有人遵循這一點,因此很難知道。 然而,優秀的程序員遵循這條規則,尤其是編寫api。 如果要編寫方法並公開它。 make param final表示不會修改傳遞的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.