为啥 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 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]
为啥受保护的实例成员在不同包的子类中不可见,但受保护的类成员是? [复制]