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

时间:2011-07-26 15:43:59

标签: java static

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

private static int number;

如果我想使用外部类为变量分配一个数字,我会这样做吗?

1)使示例中的setter方法为static,这样我就可以像这样访问它:

Example.setNumber(3);

2)或使setter方法非静态,所以我创建了一个Example对象来设置数字

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

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

10 个答案:

答案 0 :(得分:12)

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

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

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 :(得分:4)

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

也就是说,如果您仍然想要设置该值,请将其设置为静态方法,因此您不需要实例化该对象以设置静态值。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

如果它是静态变量,请将setter设为静态。必须创建一个实例来修改属于整个类的东西既冗长又浪费。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

但要注意创建全局变量!

答案 6 :(得分:2)

创建类的实例只是为了在其上设置静态变量是没有意义的。我会选择#1。 (虽然我试图避免全局变量,这就是静态变量。)

答案 7 :(得分:2)

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

我认为我们无法用现有信息回答这个问题。例如,如果需要setNumber方法来实现接口,那么它应该是#2实例方法。告诉我们将使用setNumber方法的位置。