簡體   English   中英

它是不可變的類嗎?

[英]Is It Immutable Class?

這下課是一成不變的嗎?

class Immutable {

  private int x;

  Immutable(int value) {
    this.x = value;
  }

  public int getX(){
    return x;
  }
}
  1. 類不是最終的,因為子類看不到任何成員

  2. 實例變量x不是最終變量,因為沒有設置方法。

此類在不添加任何代碼的情況下是否有可能打破不可變功能的約定?

該類實際上是不可變的。

但是您仍然可以使用反射來設置變量x的值,因為該變量不是最終變量。

Immutable類是不可變的。

但是,可以聲明其實例是可變的Immutable的子類。 確實,防止這種情況的唯一方法是使此類成為final ...或將其構造函數設為私有。

您可能會((我會)認為)可變的Immutable子類違反了Immutable的約定。


使用反射更改x值的方法違反了規則。 Java規范說未指定執行此操作的應用程序的行為。 (當然,它打破了JLS說允許JIT編譯器進行的各種假設。)

一個明智的開發人員不會做這種事情,會輕視別人做某事的可能性,並且會說盡管某些瘋子可能會改變它,但Immutable是不可變的。

約書亞·布洛赫(Joshua Bloch)在他的“有效Java”中指出: “您應該為可擴展性設計類,或者使它們不可擴展”

如果靈活性是您的首要考慮因素,並且您有充分的理由設計不可變的類進行繼承-請將該類保留為非最終類。

如果您擔心安全性-將該課程定為最終課程,將成員字段定為最終課程。 因為:

  • 通過覆蓋getter方法,可以擴展非最終類以創建可變的子類。

  • Java在設計上是反射性的。 正如Belgther所說,可以使用反射來設置member field的值。 (無論是私有的還是公共的)很久以前, 我使用它來將我的特定調試器與另一個項目集成在一起。

是的,在我看來,這是一成不變的。

因為您有一個只能在構造函數中設置的私有字段,並且該類中的唯一方法是getter,所以該字段不能再被修改,並且該類可以說是不可變的。

暫無
暫無

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

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