Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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_Android - Fatal编程技术网

Java 什么时候应该使用公共变量?

Java 什么时候应该使用公共变量?,java,android,Java,Android,在ScanResult的android开发者页面上,我注意到它们有公共变量BSSID、SSID、功能等等。我认为这很奇怪,因为在公共变量上使用getter/setter是java规范。为什么有时使用公共变量而不是getter/setter,有一个广泛的、基于规则的原因吗 在您提到的这个示例中,它们实际上是公共变量,这是一种糟糕的做法。奇怪的是,他们为什么要公开。这打破了封装——隐藏数据的原理,以便能够精确地控制谁以及何时设置数据 但是如果你想一想,让成员私有化,只允许愚蠢的能手和二传手有什么意义

在ScanResult的android开发者页面上,我注意到它们有公共变量BSSID、SSID、功能等等。我认为这很奇怪,因为在公共变量上使用getter/setter是java规范。为什么有时使用公共变量而不是getter/setter,有一个广泛的、基于规则的原因吗

在您提到的这个示例中,它们实际上是公共变量,这是一种糟糕的做法。奇怪的是,他们为什么要公开。这打破了封装——隐藏数据的原理,以便能够精确地控制谁以及何时设置数据

但是如果你想一想,让成员私有化,只允许愚蠢的能手和二传手有什么意义呢?这与直接设置它们相同

答案是: 1.如果将字段公开,则不可能更改类的API,并且如果以后决定在getter或setter中设置一些日志记录或安全约束,则无法在不破坏人们代码的情况下将这些字段私有化。 2.getter和setter允许在子类中重写。 还有许多其他优势

总之,把这些领域公之于众是愚蠢的。没想到谷歌工程师会这么做。他们还使类扩展了对象(在java中是默认情况)

  • 默认情况下保持变量私有
  • 需要从包外部访问的变量应使用访问器方法(getter/setter)
  • 仅在私有包中使用的变量可以安全地“公开”

形式为“为什么开发人员X做出决定Y?”的问题不适合堆栈溢出。通常,唯一明确知道答案的一方是开发人员X,开发人员X不太可能看到您的问题。其他任何人只能提供意见。在这种情况下,这一决定是十多年前作出的。现在,出于向后兼容性的原因,他们一直坚持使用它。@commonware我想知道是否有关于公共变量的规则存在异常。例如,如果对象通常位于列表中且仅位于列表中,则可以具有公共变量,并且仍然考虑适合java OOP。使用
ScanResult
作为一个更广泛的类设计问题的示例是可以的,但正如所写的,您的问题是关于
ScanResult
本身的。@Commonware我明白您的观点,并将问题编辑得更广泛,仅使用ScanResult作为示例。感谢您帮助我了解如何在stackoverflow上提出正确的问题!我个人一直认为,如果你有一个公开的二传手和传接手,而他们除了设置和传接手之外什么都不做,那么他们基本上只是对一个公开成员发出噪音。(如果你有大量的能手和二传手,你可能做错了),首先,谢谢你的回答。你说得对!我没有在问题的背景下考虑变量,因为没有理由改变它们。虽然页面没有声明它们是最终的,这让我觉得它们不是常量,但更改这些变量并不能实现任何效果。这类似于接收数据并决定您不喜欢它,因此您会对其进行重写。虽然在
ScanResults
上有常量,但也有许多
public
final
字段。