在类中我们通常声明全局变量和局部变量。我经常看到声明全局变量、setter 和 getter。这些每次都是必不可少的吗?如果我可以在不使用这些东西的情况下实现它,可以吗?
4 回答
通常,您应该始终尝试减少变量、方法、类等的可见性范围。
因此,如果您需要在一个调用序列中使用的某个变量,请使用局部变量和方法参数将其值从一个方法传递到另一个方法。例如,我有 2 个方法foo()
和bar()
whilefoo
调用bar
:
public void foo() {
bar();
}
private void bar() {
}
假设两者都在附加一些后缀的相同字符串上工作。您可以使用局部变量,如下例所示:
public String foo(String s) {
s += "foo1"
bar(s);
s += "foo2"
return s;
}
private String bar(String s) {
s += "bar1"
return s;
}
或类级别变量:
private String s;
public String foo() {
s += "foo1"
bar();
s += "foo2"
return s;
}
private String bar() {
s += "bar1"
return s;
}
第一种方法更好,因为:
- 它被封装。没有人知道实施的细节。没有人可以从外部影响它。
- 它更容易阅读:您不必来回查看代码以了解哪些对象参与了实现。
- 它是线程安全的,无需任何额外的工作,例如同步块或原子变量,因为它从不使用对象级变量。
第二种实现未封装:可以添加更改对象状态并影响下一次调用foo()
. 您必须在课堂上前后来回了解算法以及受算法影响的变量。它不是线程安全的。运行相同代码的两个并发线程可能会竞争更改相同的变量。
全局变量是指类成员字段?如果变量只在方法的范围内使用,那么它应该是局部的。如果变量本质上携带了整个类实例的任何状态信息——它应该被声明为类成员字段(使用 setter 和 getter——如果需要将这些字段的访问权限授予其他类)。
关于 Java 类的好总结在这里:http ://docs.oracle.com/javase/tutorial/java/javaOO/summaryclasses.html
我猜您将“全局变量”定义为成员字段变量(在方法的上下文之外定义)。使用成员字段时最好使用 mutators(setter)和 accessors(getter),以便更轻松地更改实现。一个很好的例子是,如果您在获取或设置变量状态时检查字段周围的条件,您可以将更改封装在一个位置,而不是在每次使用时分散。
Java中没有全局变量。
只有当它是对象的属性时,它才应该存在。例如,不应使用它来存储对象的两个方法调用之间的中间结果。
仅当外部世界需要访问信息时才应定义 Getter。如果不需要,请不要定义 getter。越私有的状态越好,因为它允许类进化而不影响其他类。
只有在需要修改字段并且单独修改该字段与其他字段有意义时,才应修改 setter。
好的规则:
- 更少的状态比更多的状态更好
- 不可变状态优于可变状态
- 一个方法应该总是将一个对象从一个稳定一致的状态带到另一个稳定一致的状态。