2016-02-29 36 views
-2

我有一個類,例如:如何使用AtomicInteger?

public class A{ 
    private final int number; 

    public A(int number){ 
     this.number = number; 
    } 
} 

Quesiton是,我想更新number時間的時候,我必須做一個對象無狀態,這意味着nubmer必須是最後的。我的朋友建議我使用AtomicInteger班,但我不知道如何使其工作。

+0

'final'將使屬性不可變。無狀態依賴於上下文,也就是你用'number'做什麼 - 你可以用一個'A'來執行一個opterion,它不會在操作之前使A處於一個可區分的狀態,所以它將是無狀態的從某種意義上說 - 但這又取決於你需要定義的意義。 –

+2

嗯..如果它包含一個可變狀態,A怎麼可能是無狀態的? – ZhongYu

+0

「我想每次更新數字時間,並且我必須讓一個對象成爲無狀態的」< - 您不能同時擁有這兩個對象。這感覺像是[X-Y問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem);你最近想做什麼?你正在解決的背景和問題是什麼? –

回答

0

的AtomicInteger是線程安全的,你應該使用這樣的:

public class Atomic{ 
    private AtomicInteger number; 

    public Atomic(int number){ 
     this.number = new AtomicInteger(number); 
    } 

    public int getNumber() { 
    return number.get(); 
    } 

    public void setNumber(int number) { 
    this.number.set(number);; 
    } 

} 

但是,如果你想使最終的東西你不應該使用的AtomicInteger,並最終必須在編譯時已知,以便您的解決方案封裝,像你這樣做:

public final class Atomic{ 
    private int number; 

    public Atomic(int number){ 
     this.number = number; 
    } 

    public int getNumber() { 
    return this.number; 
    } 
} 

對於無國籍的對象,我認爲你誤解了它的含義。

+0

帥哥,感謝您的回覆,建議使用'final AtomicInteger i',引用永遠不會改變,但是對象中的值可能會改變。但我不知道這有什麼好處。 –

+0

你究竟想在這裏做什麼? –

1

擁有一個AtomicInteger不會使該類無狀態。更新整數,無論​​是否爲原子,都會改變實例的內部狀態。

您可以使該類不可變,即狀態不能更改,併爲每個狀態更改創建一個新實例。例如:

public class A { 
    private final int number; 
    public A(int n) { 
     number = n; 
    } 
    public int getNumber() { 
     return number; 
    } 
    public A setNumber(int n) { 
     return new A(n); 
    } 
} 
+0

傢伙,感謝您的回覆,建議使用最終的AtomicInteger我,引用永遠不會改變,但對象中的值可能會改變。但我不知道這有什麼好處。 –