为啥 Checkstyle 中默认不允许受保护的变量?

Posted

技术标签:

【中文标题】为啥 Checkstyle 中默认不允许受保护的变量?【英文标题】:Why are protected variables not allowed by default in Checkstyle?为什么 Checkstyle 中默认不允许受保护的变量? 【发布时间】:2012-01-17 22:10:03 【问题描述】:

我在 Eclipse 中收到很多这样的警告:

变量“myVariable”必须是私有的并且具有访问器方法。

我想我得到了它们,因为我没有在 Eclipse 中手动将 protectedAllowed 设置为 true。但是为什么默认设置为false呢?我不应该使用受保护的属性吗?

【问题讨论】:

【参考方案1】:

理论上,受保护的属性(变量)是面向对象语言中的反模式。如果只有子类需要访问其超类的成员属性,则将属性本身定义为私有并创建受保护的访问器方法(getter 和 setter)。这种方法应用了“信息隐藏”的概念。还有一种替代解决方案:定义受保护的不可变(最终)成员属性。

进一步阅读:

Should you ever use protected member variables? http://www.codinghorror.com/blog/2006/08/properties-vs-public-variables.html

【讨论】:

@Oli Charlesworth:好的,“正式”可能不是正确的术语,如果我说“理论上”,你会同意吗?【参考方案2】:

我想,将所有内容设为私有是一种反模式。通常,类是成堆使用的,并且作为一个整体表示放置在单独包中的封装实体。他们不需要互相隐藏某些东西,但是这条规则会无缘无故地强制隐藏,增加混乱并有效地使风格(据我了解)变得更糟。同时,我们经常看到包中的每个类都是公共的。我想这更糟,但 checkstyle 并没有检查。

封装不仅存在于类层面,还存在于包、系统等层面。而且我认为这些层次更为重要。

【讨论】:

【参考方案3】:

允许包访问可简化包内的编程,并减少样板代码。很多时候,只需要从包内访问。私有访问迫使您创建许多几乎无用的访问器方法。这实际上具有减少封装和信息隐藏的效果,因为类必须在应用程序范围内公开内部数据/结构,而不仅仅是通过公共访问器方法在包范围内公开。默认的包可见性也使测试更容易,因为测试类也存在于同一个包中(在测试目录/树中)。

【讨论】:

以上是关于为啥 Checkstyle 中默认不允许受保护的变量?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中,为啥语言不强制对类/结构的公共、私有和受保护成员进行分组?

为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]

为啥受保护的实例成员在不同包的子类中不可见,但受保护的类成员是? [复制]

java - 为啥在java中可以具有默认修饰符的类不能受到保护

为啥Java中允许受保护的静态? [关闭]

采用抽象超类实例和“不允许访问受保护方法”错误的受保护方法