具有public
变量的类在封装中被认为是弱的并且这不是一个糟糕的设计实践吗?
如果是这种情况,为什么java.awt.Dimension
有2个公开变量width
和height
?
答案 0 :(得分:3)
我认为暴露公共字段并不违反封装本身。封装是实体的属性,隐藏在自身内部是一个复杂的内部结构。这种复杂的结构不能直接访问,因此不会有被破坏的风险。它只能通过公共方法访问,这使得它们的工作很好并且不会破坏复杂的内部结构。例如,我们无法直接访问HashMap
的哈希表,我们也无法破坏它。我们只使用get
和put
方法,它们正确地处理哈希表状态。但是Dimension
对象的复杂结构在哪里?当我们写d.width = 23
时会发生什么事情?
我认为在这种情况下,有理由使用公共getter / setter而不是公共字段:品味和惯例。我想,后者更重要。但这也取决于我们应用这些约定的地点和内容。
答案 1 :(得分:1)
如果你看一下JavaDoc for Dimension: http://docs.oracle.com/javase/7/docs/api/java/awt/Dimension.html
你会看到自1.0(1996)以来公共领域一直存在。随着时间的推移,语言已经发展到适应许多原则和最佳实践,成为今天的语言。这包括对1.1版本的AWT模型进行重新修改,其中为这些字段添加了访问器和更改器。
以下是JDK 1.1版本的一些存档发行说明: http://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/awt/HowToUpgrade.html
引用它:
“这些更改使GUI构建器和程序等程序成为可能 JavaBeans-使用程序来查询组件以确定 组件的属性。“
答案 2 :(得分:0)
Dimension已经存在很长时间了,在Java的早期阶段,人们对性能产生了真正的担忧。因此,他们使用公共变量并将其变为可变 - 两个主要错误,只是为了获得几个时钟周期。
所有人都在询问有关过早优化的问题,可以在这里学到很好的教训。 (追加)
尺寸变化很大(当窗口调整大小时)并且通过使其变得可变,您“保存”必须分配新对象 - 只需重用旧对象。在Java的早期,这是有道理的。另外,随着GUI在Frames中的组件内绘制嵌套按钮,他们被访问了很多,因此,为了在重绘中保存几个周期,不要使用函数调用。再次,有点意义。
现在的问题是,如今所有的多核处理器和多线程代码都经常会制作一个Dimension的防御性副本。失去所有“优点”,加上,烦人和错误的来源。