簡體   English   中英

Java - 克隆 getter 方法中的屬性

[英]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方法,這個類的用戶可以做很多不道德的事情:

  1. 改變日子的順序,
  2. 更改天的名稱,
  3. ...

但是,返回一個克隆不會影響類和它的數據。 因此,類的其他用戶不會受到影響。

如果你想保證整個對象圖(包含數組)是不可變的,你可以在get() clone() or System.arraycopy()clone() or System.arraycopy() 這通常在公開數組的 API 是公共的並且數組中的值存在約束或對象被多個線程訪問時完成。 在這種情況下,不變性很重要。

假設您有一個具有getItemsSortedByPrice()方法的GroceryStore對象。 您將項目保留在按價格維護訂單的數組中,但如果您返回此數組,客戶端代碼可能會修改它並破壞對象的(內部)不變量。

如果這是內部代碼(即)不是公共 API 的一部分,並且您知道您不會修改數組,那么克隆/應對可能沒有必要,因為它會損害性能而沒有真正的好處。

一切都取決於上下文。

數組只是對象,適用於普通對象的所有 (im) 可變性規則/實踐也適用於數組。

我認為您的用例與建議的 Java 代碼不匹配。 該示例適用於與您不同的用例。

最后一個數組對我來說聽起來像Enums ,我認為這更符合您的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM