如何通过setter方法修改私有静态变量

14

我有一个变量在名为Example的类中:

private static int number;

如果我想使用外部类赋值给变量,应该怎么做?

1)将Example类中的setter方法设为静态,这样我就可以像这样访问它:

Example.setNumber(3);

2) 或者将setter方法设为非静态,这样我就可以创建Example的对象来设置数字

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

这两者之间有什么区别,哪一个更好?

10个回答

13

在这种情况下,建议使用静态方法。

为什么呢?如果你将其设置为非静态方法,那么会导致以下惊人的效果:

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...

1
这个原因对我来说不是很令人信服。(1) 如果e1和e2在并行线程中被访问,我们将会看到相同的惊人效果。(2) 如果我们实现setNumber(int num){if(num<4){number=num;}}-静默丢弃不合适的输入,那么我们也将看到相同的惊人效果。 - emory

5

首先,您真的不应该设置静态变量。这很容易引起问题,并且通常表明设计不良。唯一应该使用静态变量的时候是用于线程安全的不可变对象和单例模式。

话虽如此,如果您绝对仍然想要设置值,请将其设置为静态方法,因为您不需要实例化对象就可以设置静态值。


4

第一个是正确的。当您访问静态方法时,应使用类名而不是对象引用。


3
如果是静态变量,就让setter方法也是静态的。不必为了修改整个类所拥有的某个东西而创建一个实例,这既啰嗦又浪费资源。

3
请不要使用第二种选项。仅为一个赋值创建一个实例是不好的做法:P。根据您的需要使用第一种选项或只需将number设置为公共变量。

2

静态变量的设置器如果不依赖于任何实例变量/函数,则也应该是静态的。因此,1)。

但要注意不要创建全局变量!


2

没有必要创建一个类的实例,只是为了设置其中的静态变量。我会选择方案#1。(虽然我尽量避免使用全局变量,这就是静态变量的作用。)


2

静态成员变量对于类的所有实例都是相同的。您可以使用静态或常规 setter 来更改它。但在这种情况下,常规 setter 可能会让用户感到困惑:命名约定表示 setter 更改属于特定实例的字段的值。因此,您应该使用第一个版本:Example.setNumber(3)


1

静态变量被声明为静态的,因为它们不与任何特定对象相关联。

这两种方法都可以工作,但前者更明智,因为它不需要创建和使用任意对象。


1
其他帖子的共识是使用#1静态方法。
我会争辩说我们无法根据现有信息回答这个问题。例如,如果setNumber方法是实现接口所必需的,则应该使用#2实例方法。告诉我们setNumber方法将在哪里使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接