Java 什么时候应该使用公共变量?
在ScanResult的android开发者页面上,我注意到它们有公共变量BSSID、SSID、功能等等。我认为这很奇怪,因为在公共变量上使用getter/setter是java规范。为什么有时使用公共变量而不是getter/setter,有一个广泛的、基于规则的原因吗 在您提到的这个示例中,它们实际上是公共变量,这是一种糟糕的做法。奇怪的是,他们为什么要公开。这打破了封装——隐藏数据的原理,以便能够精确地控制谁以及何时设置数据 但是如果你想一想,让成员私有化,只允许愚蠢的能手和二传手有什么意义呢?这与直接设置它们相同 答案是: 1.如果将字段公开,则不可能更改类的API,并且如果以后决定在getter或setter中设置一些日志记录或安全约束,则无法在不破坏人们代码的情况下将这些字段私有化。 2.getter和setter允许在子类中重写。 还有许多其他优势 总之,把这些领域公之于众是愚蠢的。没想到谷歌工程师会这么做。他们还使类扩展了对象(在java中是默认情况)Java 什么时候应该使用公共变量?,java,android,Java,Android,在ScanResult的android开发者页面上,我注意到它们有公共变量BSSID、SSID、功能等等。我认为这很奇怪,因为在公共变量上使用getter/setter是java规范。为什么有时使用公共变量而不是getter/setter,有一个广泛的、基于规则的原因吗 在您提到的这个示例中,它们实际上是公共变量,这是一种糟糕的做法。奇怪的是,他们为什么要公开。这打破了封装——隐藏数据的原理,以便能够精确地控制谁以及何时设置数据 但是如果你想一想,让成员私有化,只允许愚蠢的能手和二传手有什么意义
- 默认情况下保持变量私有
- 需要从包外部访问的变量应使用访问器方法(getter/setter)
- 仅在私有包中使用的变量可以安全地“公开”
ScanResult
作为一个更广泛的类设计问题的示例是可以的,但正如所写的,您的问题是关于ScanResult
本身的。@Commonware我明白您的观点,并将问题编辑得更广泛,仅使用ScanResult作为示例。感谢您帮助我了解如何在stackoverflow上提出正确的问题!我个人一直认为,如果你有一个公开的二传手和传接手,而他们除了设置和传接手之外什么都不做,那么他们基本上只是对一个公开成员发出噪音。(如果你有大量的能手和二传手,你可能做错了),首先,谢谢你的回答。你说得对!我没有在问题的背景下考虑变量,因为没有理由改变它们。虽然页面没有声明它们是最终的,这让我觉得它们不是常量,但更改这些变量并不能实现任何效果。这类似于接收数据并决定您不喜欢它,因此您会对其进行重写。虽然在ScanResults
上有常量,但也有许多public
非final
字段。