[英]Why does java.awt.Dimension have public variables?
具有public
变量的类在Encapsulation中被认为是弱的并且它是不是一个糟糕的设计实践?
如果是这种情况,为什么java.awt.Dimension
有2个公共变量的width
和height
?
我认为暴露公共领域并不违反封装本身。 封装是实体的属性,隐藏在自身内部是一个复杂的内部结构。 这种复杂的结构不能直接访问,因此不会有被破坏的风险。 它只能通过公共方法访问,这使得它们的工作很好并且不会破坏复杂的内部结构。 例如,我们无法直接访问HashMap
的哈希表,也无法破坏它。 我们只使用get
和put
方法,正确地关注哈希表状态。 但是Dimension
对象的复杂结构在哪里? 当我们写d.width = 23
时会发生什么事情?
在这种情况下,我认为有理由使用公共getter / setter而不是公共字段:品味和惯例。 我想,后者更重要。 但它也取决于我们应用这些约定的地点和内容。
如果你看看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使用程序等程序可以查询组件以确定组件的属性。”
Dimension已经存在很长时间了,在Java的早期阶段,人们对性能产生了真正的担忧。 因此,他们使用公共变量并将其变为可变 - 两个主要错误,只是为了获得几个时钟周期。
所有人都在询问有关过早优化的问题,可以在这里学到很好的教训。 (添加)
维度变化很大(当窗口调整大小时)并且通过使其变得可变,您“保存”必须分配新对象 - 只需重用旧对象。 在Java的早期,这是有道理的。 另外,随着GUI在Frames中的组件内绘制嵌套按钮,他们被访问了很多,因此,为了在重绘中保存几个周期,不要使用函数调用。 再一次,有点意义。
问题在于,如今所有的多核处理器和多线程代码都会让你经常制作一个Dimension的防御性副本。 失去所有“优点”,加上,烦人和错误的来源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.