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

Java 如何通过setter方法修改私有静态变量,java,static,Java,Static,我在名为Example的类中有以下变量: private static int number; 如果我想使用外部类为变量赋值,我会怎么做 1) 将示例中的setter方法设为静态,这样我就可以像这样访问它: Example.setNumber(3); 2) 或者使setter方法非静态,这样我就创建了一个示例对象来设置数字 Example e = new Example() e.setNumber(3); 两者之间的区别是什么?哪种方法更好?不依赖于任何实例变量/函数的静态变量的设置器也应

我在名为Example的类中有以下变量:

private static int number;
如果我想使用外部类为变量赋值,我会怎么做

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

Example.setNumber(3);
2) 或者使setter方法非静态,这样我就创建了一个示例对象来设置数字

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

两者之间的区别是什么?哪种方法更好?

不依赖于任何实例变量/函数的静态变量的设置器也应该是静态的。所以(1)


但是要小心创建全局变量

如果是静态变量,则将setter设置为静态。必须创建一个实例来修改属于整个类的内容,这既冗长又浪费。

创建一个类的实例来设置一个静态变量是没有意义的。我会选择1。(尽管我尽量避免使用全局变量,这就是静态变量。)

请不要使用第二个选项。仅仅为任务创建实例是一种犯罪:P。
根据您的需要,使用第一个选项或仅公开编号。

静态变量是静态的,因为它们不与任何特定对象关联


这两种方法都有效,但前者更合理,因为它不需要创建和使用任意对象。

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

为什么??好吧,如果你把它变成一个非静态的方法,那将导致以下令人惊讶的效果:

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进行更改。但在这种情况下,常规setter可能会混淆用户:命名约定表示setter更改属于特定实例的字段的值。因此,您应该使用第一个版本:
Example.setNumber(3)
第一个版本应该是正确的。当您访问静态方法时,您使用的是类名而不是对象引用

其他海报的共识是#1静态方法


我认为我们不能用现有的资料来回答这个问题。例如,如果setNumber方法是实现接口所必需的,那么它应该是#2实例方法。告诉我们将在哪里使用setNumber方法。

这个理由不能让我信服。(1) 如果e1和e2是在并行线程中访问的,我们将看到同样令人惊讶的效果。(2) 如果我们实现了setNumber(intnum){If(num<4){number=num;}-默默地丢弃不适当的输入,那么我们将看到同样令人惊讶的效果。