[英]Java - Clone the property inside getter method
各位,
我正在瀏覽此處提到的 Java 最佳編碼實踐
http://viralpatel.net/blogs/most-useful-java-best-practice-quotes-java-developers/
第二個引用說,
引用 2:永遠不要公開類的實例字段
我同意這是絕對正確的,但我被困在這句話下面幾行的作者建議中。
他說,
private String[] weekdays =
{"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"};
public String[] getWeekdays() {
return weekdays;
}
但是編寫 getter 方法並不能完全解決我們的問題。 該陣列仍可訪問。 使其不可修改的最佳方法是返回數組的克隆而不是數組本身。 因此 getter 方法將更改為
public String[] getWeekdays() {
return weekdays.clone();
}
我自己從未在 Java 類的任何 getter 方法中使用過clone()
。
我想知道(因為它被提到是一種良好的做法) - 為什么should use
在 getter 方法中should use
/ shouldn't use
clone()
? 在哪些情況下?
它是否有資格成為 Java 的良好編碼實踐?
謝謝
這在Joshua Bloch 的“Effective Java”一書中討論過。 有一個部分稱為“需要時制作防御性副本” (第 2 版第 39 節)。
https://www.informit.com/articles/article.aspx?p=31551&seqNum=2
一本很好的書,可以討論這樣的話題。
private String[] weekdays =
{"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"};
public String[] getWeekdays()
{
return weekdays;
}
如果不使用clone
方法,這個類的用戶可以做很多不道德的事情:
但是,返回一個克隆不會影響類和它的數據。 因此,類的其他用戶不會受到影響。
如果你想保證整個對象圖(包含數組)是不可變的,你可以在get()
clone() or System.arraycopy()
上clone() or System.arraycopy()
。 這通常在公開數組的 API 是公共的並且數組中的值存在約束或對象被多個線程訪問時完成。 在這種情況下,不變性很重要。
假設您有一個具有getItemsSortedByPrice()
方法的GroceryStore
對象。 您將項目保留在按價格維護訂單的數組中,但如果您返回此數組,客戶端代碼可能會修改它並破壞對象的(內部)不變量。
如果這是內部代碼(即)不是公共 API 的一部分,並且您知道您不會修改數組,那么克隆/應對可能沒有必要,因為它會損害性能而沒有真正的好處。
一切都取決於上下文。
數組只是對象,適用於普通對象的所有 (im) 可變性規則/實踐也適用於數組。
我認為您的用例與建議的 Java 代碼不匹配。 該示例適用於與您不同的用例。
最后一個數組對我來說聽起來像Enums ,我認為這更符合您的要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.