2012-04-19 116 views
-5

在课堂上,我们通常会声明全局变量和局部变量。我大部分时间看到声明全局变量,setter,getters。这些都是必不可少的吗?如果我可以在不使用这些东西的情况下实施它,那么可以吗?哪一个更好,在类中声明全局变量或在Java类中声明局部变量?

+1

他们做不同的事情。哪个更好?一辆汽车还是一列火车? – SLaks 2012-04-19 13:52:33

+1

@SLaks,显然一只熊是优越的! – Jakub 2012-04-19 13:54:39

+0

只需使用正确的工具即可完成工作。 – BalusC 2012-04-19 13:58:49

回答

3

一般来说,你应该尽量减少变量,方法,类等等知名度的范围

所以,如果你需要一些变量,在一个调用序列用于使用局部变量和方法参数从方法到方法传递其价值。 比如我有2种方法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. 它是线程安全的,没有任何额外的工作,如同步块或原子变量,因为它从不使用对象级变量。

第二个实现不是封装的:可以添加更改对象状态并影响下一次调用foo()的代码。你必须在课堂上前进和后退,以了解算法和受算法影响的变量。它不是线程安全的。运行相同代码的两个并发线程可能会改变相同的变量。

1

通过全局变量你是指类成员字段?如果变量只在方法的范围内使用,那么它应该是本地的。如果变量基本上为整个类实例承载任何状态信息 - 它应该声明为类成员字段(使用setter和getters - 如果需要将这些字段授予其他类)。

在Java类很好的总结在这里:http://docs.oracle.com/javase/tutorial/java/javaOO/summaryclasses.html

+0

-1。如果不需要,不要提供吸气剂。更重要的是:如果不需要,不要提供setter,只有在修改属性时才提供setter。 – 2012-04-19 13:58:59

+0

@JBNizet通过一切手段减去我,因为setter和getters是我的答案的主要观点(他们不是!) – maksimov 2012-04-19 14:03:20

+0

如果您在括号之间删除了答案的最后部分,我会取消您。这导致认为每个领域都必须有一个getter和一个setter,这是许多新手所犯的一个大错误。 – 2012-04-19 14:05:42

1

我猜你是界定“全局变量”作为一个成员字段变量(一个方法的上下文之外定义)。使用成员字段时最好使用增变器(setter)和访问器(getters),以便更容易地更改实现。一个很好的例子是,如果您在获取或设置变量状态时检查字段周围的条件,则可以将更改封装在一个位置,而不是每次使用时都传播。

0

Java中没有全局变量。

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

只有当外界需要访问信息时才能定义吸气剂。如果不需要,则不要定义吸气剂。越私人的状态越好,因为它可以让班级在不影响其他班级的情况下进行平衡。

只有在需要修改字段的情况下才能对修改器进行修改,并且将该字段与其他修改器隔离开来是有意义的。

好规则:

  • 以下状态不止状态比可变的状态更好
  • 不可改变的状态较好
  • 的方法应该总是把对象从稳定一致的状态到另一个稳定一致的状态。