Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java的类中声明全局变量还是在类中声明局部变量,哪一个更好?_Java_Design Patterns - Fatal编程技术网

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

在Java的类中声明全局变量还是在类中声明局部变量,哪一个更好?,java,design-patterns,Java,Design Patterns,在课堂上,我们通常声明全局变量和局部变量。我大部分时间都看到声明全局变量、setter和getter。这些是否每次都是必需的?如果我不使用这些东西就可以实现它,可以吗?全局变量指的是类成员字段?如果变量只在方法的范围内使用,那么它应该是局部的。如果变量本质上携带了整个类实例的任何状态信息,则应将其声明为类成员字段(使用setter和getter,如果需要将这些字段的访问权授予其他类) 这里有关于Java类的一个很好的总结:我猜您将“全局变量”定义为一个成员字段变量(在方法上下文之外定义)。在使用

在课堂上,我们通常声明全局变量和局部变量。我大部分时间都看到声明全局变量、setter和getter。这些是否每次都是必需的?如果我不使用这些东西就可以实现它,可以吗?

全局变量指的是类成员字段?如果变量只在方法的范围内使用,那么它应该是局部的。如果变量本质上携带了整个类实例的任何状态信息,则应将其声明为类成员字段(使用setter和getter,如果需要将这些字段的访问权授予其他类)


这里有关于Java类的一个很好的总结:

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

Java中没有全局变量

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

只有当外部世界需要访问信息时,才应该定义getter。如果不需要,就不要定义getter。状态越私有,它就越好,因为它允许类在不影响其他类的情况下进行解决

只有在需要修改字段,并且与其他字段隔离修改此字段有意义时,才应修改setter

良好规则:

  • 少州胜于多州
  • 不变状态比可变状态好
  • 一个方法应该总是将一个对象从一个稳定的一致状态带到另一个稳定的一致状态

通常,您应该尽量缩小变量、方法、类等的可视范围

所以,如果您需要在一个调用序列中使用某个变量,请使用局部变量和方法参数将其值从一个方法传递到另一个方法。 例如,我有两个方法
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;
}
第一种方法更好,因为:

  • 它是封装的。没有人知道实施的细节。没有人能从外部影响它
  • 它更易于阅读:您不必在代码中来回移动来了解哪些对象参与了实现
  • 它是线程安全的,没有任何额外的工作,如同步块或原子变量,因为它从不使用对象级变量
    第二个实现没有封装:可以添加更改对象状态并影响下一次调用
    foo()
    的代码。你必须在课堂上反复学习,才能理解算法以及算法影响哪些变量。它不是线程安全的。运行相同代码的两个并发线程可能会在更改相同变量时竞争

    他们做不同的事情。哪个更好?一辆汽车还是一列火车?@斯拉克斯,很明显熊更优越!只需使用合适的工具即可。如果不需要,不要提供getter。更重要的是:如果不需要,不要提供setter,只有在修改属性有意义时才提供它。@jbnize请务必减去一个我,因为setter和getter是我答案的要点(它们不是!),如果您删除答案的最后一部分,在括号之间,我将取消减去您。这导致人们认为,每个领域都必须有一个接受者和一个接受者,这是许多新手所犯的一个大错误。@jbnitest。编辑。