可變物件和不可變物件的差異


在 Java 中,不可變物件的 狀態 在建立後不能被修改,但可以引用其他物件。它們在多執行緒環境中非常有用,因為多個執行緒無法更改物件的狀態,因此不可變物件是執行緒安全的。不可變物件非常有助於避免時間耦合,並且始終具有故障原子性,並且在多執行緒中也很有用。為什麼呢?因為沒有人可以更改物件,對吧?所以,它變得執行緒安全,這意味著當程式的不同部分嘗試訪問該特定物件時,它不會導致任何意外問題。

另一方面,我們有可變物件,我們可以在任何狀態下更改它們。它們欄位可以在建立後更改。但正因為如此,它們不是執行緒安全的,在多執行緒程式中使用它們時,我們需要格外小心。

現在,讓我們詳細瞭解一下這兩者之間的區別。

可變物件與不可變物件

關鍵 可變物件 不可變物件
基本概念 我們可以在建立可變物件後修改其狀態。例如,如果我們建立一個名為筆記型電腦的物件,帶有品牌名稱(如戴爾),然後更新品牌名稱(如惠普)。 一旦建立了不可變物件,其狀態就會被鎖定,我們無法更改它。如果我們稍後需要設定不同的內容,則無需更改特定欄位,而是需要建立一個新物件。
執行緒安全 可變物件不是執行緒安全的,這意味著如果多個執行緒同時嘗試訪問或修改該物件,可能會導致問題,因此我們需要提前注意它。 不可變物件是執行緒安全的。因為我們在建立後無法更改其狀態,所以不同的執行緒可以訪問該物件而不會出現任何干擾或意外行為。
最終類 可變類不需要是最終類。它可以透過其他子類擴充套件,並且其行為可以透過子類修改。 要建立不可變物件,請將類設為final。這可以防止任何人建立可能修改類行為並使其可變的子類。
示例 預設情況下,所有類及其物件本質上都是可變的。像ArrayListHashMap這樣的類允許在建立後更改其內容,這使得它們本質上是可變的。 在 Java 中,像String和包裝類(如IntegerBoolean)這樣的類是不可變類的示例。一旦建立,它們的狀態以後就不能修改。

不可變類的示例

public final class ImmutableClass {
   private final String laptop;
   public ImmutableClass(String laptop) {
      this.laptop = laptop;
   }

   public String getLaptop() {
      return laptop;
   }
}
public class Main {
   public static void main(String[] args) {
      ImmutableClass immutableClass = new ImmutableClass("Dell");
      System.out.println(immutableClass.getLaptop());  
   }
}

輸出

Dell

可變類的示例

public class MutableClass {
   private String laptop;   
   public MutableClass(String laptop) {
      this.laptop = laptop;
   }   
   public String getLaptop() {
      return laptop;
   }   
   public void setLaptop(String laptop) {
      this.laptop = laptop;
   }
}   
public class Main {
   public static void main(String[] args) {
      MutableClass mutableClass = new MutableClass("Dell");
      System.out.println(mutableClass.getLaptop());  
      mutableClass.setLaptop("IBM");
      System.out.println(mutableClass.getLaptop());  
   }
}

輸出

Dell
IBM

更新於: 2024年10月10日

4K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.