【问题标题】:Java - Global variables vs Global methodsJava - 全局变量与全局方法
【发布时间】:2012-12-22 16:53:32
【问题描述】:

我正在研究一个包含 5000 多个课程的项目,然后我在每个课程中都看到了这个:

private static int foo = 1;

private static void setfoo(int value)
{
     foo = value;
}

private static int getfoo()
{
     return foo;
}

所以,我想为什么不使用全局变量并设置它,如果无论如何都是静态的。

全局方法和变量在资源使用上有区别吗?

谢谢。

【问题讨论】:

  • Ummmm...我认为publicstatic 变量(或publicstatic 的getter)与Java 中的全局变量一样接近。此外,全局变量通常是您要避免的。
  • java 中没有“全局方法”或“全局变量”之类的东西。一个类可以有静态方法或字段。这是你刚刚发布的内容。
  • 如果这些静态变量是私有的并且它们的访问器也是私有的,那么通过 getter 和 setter 访问它们就没有多大意义。它只是增加了噪音,恕我直言。无论如何,静态可变变量都是一种气味。

标签: java resources global-variables global-methods


【解决方案1】:

Getter 和 Setter 很有用,例如,如果您想在将来添加验证(或添加日志记录,或进行访问统计或...)

【讨论】:

  • 那么,两者是一回事吗?如果我想在函数中添加记录器或其他东西,只是不同吗?
【解决方案2】:

如果 getter/setter 存在,请始终使用它们。 getFoosetFoo 有效地定义了一个名为“Foo”的属性,它在概念上与您的变量foofoo 只是持有该属性当前值的变量,可以认为属于该属性。

但请记住,属性不必只是获取/设置其支持变量。它还可以在设置之前验证您传入的值。它可以同步对变量的访问。和/或将来,setter 可能会改变其他事物的特性,而 getter 可以返回其他事物的当前状态,甚至不需要支持变量。通过直接设置变量,您会在将来/将要更改属性以执行任何操作的情况下产生兼容性问题。

但是,如果您知道 setFoo 除了设置一个名为 foo 的变量之外什么都不做(并且在不久的将来仍然会做),那么 实际上最好是 没有有一个getter/setter。它们不是更干净,更易读,而且它们当然也不是更有效; a = 3; doStuffWith(a); 在所有方面都胜过 setA(3); doStuffWith(getA());。他们的缺席使您摆脱了只需要一个变量的属性的概念包袱。仅当您需要(或肯定会很快需要)属性可以提供的特殊行为时才添加 getter/setter。 但是一旦你添加了它们,就可以在任何地方使用它们。

【讨论】:

  • 如果访问者是公开的,我会同意,但它们是私有的。所以代码的改变只会影响类本身。
  • @JBNizet:不会改变代码不再与自身兼容的情况,您必须将一百个不同的foo = 1;s 更改为@987654330 @s 在你可以在Foo 后面实现一些特殊行为之前。 :P getter 和 setter 已经在那里了;应该使用它们。
  • 那么,您是否建议我们永远不要直接从定义它的类内部访问任何私有变量,而总是使用 getter/setter?我更喜欢现在拥有清晰可读的代码,并仅在需要时对其进行重构,而不是现在混乱我的代码以防万一将来发生某些事情。
  • @JBNizet:我是说如果getter 和setter 存在,是的,应该始终使用它们而不是直接设置变量。您现在有两个不同的语句来设置foo,但从概念上讲,它们Foo 不同。并且只有其中一个保证始终设置Foo;另一个只是设置foo。如果 Foo 永远不会有特殊行为,那么 getter 和 setter 应该被取消......但不应该有两种公认的方式来处理完全相同的变量。
【解决方案3】:

字段、getter 和 setter 都是私有的和静态的。这意味着它们的预期目的只能在类中使用。因此,如果您在某个所有类可访问的地方(全局可访问)创建它,另一个公共类那么您也必须跟踪该字段,因为在每个类中它必须在使用之前初始化为某个值(在你的情况下它1 我觉得)。此外,您必须使此代码互斥以始终保持正确(如果调用 5000 次,它真的会变慢).. 接听电话.. 一切由您决定..

【讨论】: