哪一个更好,在类中声明全局变量或在Java类中声明局部变量?

时间:2012-04-19 13:50:17

标签: java design-patterns

在课堂上,我们通常会声明全局变量和局部变量。我大部分时间都看到声明全局变量,setter,getter。这些都是必不可少的吗?如果我可以在不使用这些东西的情况下实施它,这样可以吗?

4 个答案:

答案 0 :(得分:3)

通常,您应该总是尝试减少变量,方法,类等的可见性范围。

因此,如果需要在一个调用序列中使用的某个变量,请使用局部变量和方法参数将其值从方法传递给方法。 例如,我有两种方法foo()bar(),而foo则调用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;
}

第一种方式更好,因为:

  1. 它是封装的。没有人知道实施的细节。没有人可以从外面影响它。
  2. 它更易于阅读:您无需前后返回代码即可了解哪些对象参与了实施。
  3. 它是线程安全的,没有任何额外的努力,如同步块或原子变量,因为它从不使用对象级变量。
  4. 第二个实现没有封装:可以添加更改对象状态的代码,并影响下一次调用foo()。您必须在课程中前进和后退才能理解算法以及哪些变量受算法影响。它不是线程安全的。运行相同代码的两个并发线程可能会在更改同一变量时竞争。

答案 1 :(得分:1)

全局变量是指类成员字段?如果变量仅在方法范围内使用,则它应该是本地的。如果变量实际上是为整个类实例传递任何状态信息 - 它应该被声明为类成员字段(使用setter和getters - 如果需要将这些字段的访问权限提供给其他类)。

关于Java类的总结如下:http://docs.oracle.com/javase/tutorial/java/javaOO/summaryclasses.html

答案 2 :(得分:1)

我猜你正在将“全局变量”定义为成员字段变量(在方法的上下文之外定义)。在使用成员字段时,最好使用mutators(setter)和accessors(getters),以便更轻松地更改实现。一个很好的例子是,如果在获取或设置变量状态时检查字段周围的条件,则可以将更改封装在一个位置,而不是在每次使用时分散。

答案 3 :(得分:0)

Java中没有全局变量。

只有当字段是对象的属性时,才应存在该字段。例如,它不应该用于在对象的两个方法调用之间存储中间结果。

只有在外界需要访问信息时才应定义吸气剂。如果不需要,请不要定义getter。私有状态越多,它就越好,因为它允许类在不影响其他类的情况下进行集合。

只有在需要修改字段时才应修改setter,并且如果将该字段与其他字段分开修改是有意义的。

好的规则:

  • 较少的状态比更多的状态更好
  • 不可变状态优于可变状态
  • 方法应始终将对象从稳定的一致状态转移到另一个稳定的一致状态。