2016-09-26 82 views
0

的Java一成不變的類可以通過聲明它由不變性VS線程安全

  1. 聲明級決賽中被創建。
  2. 聲明所有成員字段最終。
  3. 沒有安裝程序。

如果沒有setter和class聲明爲final爲什麼我們應該設置成員final?

另外,我可以說,如果一個類是不可變的意味着它是線程安全的?

+2

可能重複[不可變對象是線程安全的,但爲什麼?](http://stackoverflow.com/questions/9303532/immutable-objects-are-thread-safe-but-why) – Dez

+0

。如果沒有setters和class聲明爲final爲什麼我們應該設置成員final?這是我的主要問題 – aspxsushil

回答

1

如果沒有setter和class聲明爲final爲什麼我們應該設置成員final?

避免內部狀態被修改內部。下面的類從外面看起來一成不變的,我們希望getBar()通話是免費的副作用(這意味着每當的時候,我們調用這個方法,我們預計相同結果,也被稱爲決定)。但它不是,因爲撥打doThing()bar有副作用。

public final class Foo { 
    private int bar; 

    public Foo(int bar) { 
     this.bar = bar; 
    } 

    public int getBar() { 
     return bar; 
    } 

    public void doThing() { 
     //do some things 

     //increment bar for some reason 
     bar++; 
    } 
} 

如果barfinal上面的代碼將無法編譯。

我可以說,如果一個類不可變意味着它是線程安全的?

不是必須的,但在許多情況下是的。