簡體   English   中英

如何通過setter方法修改私有靜態變量

[英]How to modify private static variable through setter method

我在名為Example的類中有以下變量:

private static int number;

如果我想使用外部類為變量賦值,我會這樣做嗎?

1)使示例靜態的setter方法,所以我可以像這樣訪問它:

Example.setNumber(3);

2)或使setter方法非靜態,所以我創建一個Example對象來設置數字

Example e = new Example()
e.setNumber(3);

兩者之間有什么區別,哪一種更好?

在這種情況下,建議使用靜態方法。

為什么? 好吧,如果你使它成為一個非靜態的方法,那將導致以下驚人的效果:

Example e1 = new Example();
Example e2 = new Example();

e2.setNumber(3);
e1.setNumber(5);

System.out.println(e2.getNumber()); // surprise! prints 5,     

所以即使你在e1上調用了這個方法,e2也會受到影響。 相應的靜態示例不那么令人驚訝:

Example e1 = new Example();
Example e2 = new Example();

Example.setNumber(5);
System.out.println(Example.getNumber()); // prints 5, no surprise...

首先,你真的不應該設置靜態變量。 它容易引起問題,並且通常表明設計不良。 應該使用靜態變量的唯一時間是線程安全的不可變對象和單例。

也就是說,如果您仍然想要設置值,請將其設置為靜態方法,因此您不需要實例化對象以設置靜態值。

第一個是正確的。 當您訪問靜態方法時,您使用類名而不是對象引用

如果它是靜態變量,請將setter設為靜態。 必須創建一個實例來修改屬於整個類的東西既冗長又浪費。

請不要使用第二個選項。 僅為作業創建實例是犯罪:P。 根據您的需要,使用第一個選項或公開number

不依賴於任何實例變量/函數的靜態變量的setter也應該是靜態的。 所以1)。

但要注意創建全局變量!

沒有必要創建一個類的實例只是為了設置一個靜態變量。 我會選擇#1。 (雖然我試圖避免全局變量,這是靜態變量。)

所有類的實例的靜態成員都是相同的。 您可以使用靜態或常規setter進行更改。 但是在這種情況下,常規setter可能會使用戶感到困惑:命名約定表明setter會更改屬於特定實例的字段的值。 因此,您應該使用第一個版本: Example.setNumber(3)

靜態變量是靜態的, 因為它們不與任何特定對象相關聯。

這兩種方法都有效,但前者更為明智,因為它不需要創建和使用任意對象。

其他海報的共識是#1靜態方法。

我認為我們無法用現有信息回答這個問題。 例如,如果需要setNumber方法來實現接口,那么它應該是#2實例方法。 告訴我們將使用setNumber方法的位置。

暫無
暫無

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

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