繁体   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