繁体   English   中英

为什么java.awt.Dimension有公共变量?

[英]Why does java.awt.Dimension have public variables?

具有public变量的类在Encapsulation中被认为是弱的并且它是不是一个糟糕的设计实践?

如果是这种情况,为什么java.awt.Dimension有2个公共变量的widthheight

我认为暴露公共领域并不违反封装本身。 封装是实体的属性,隐藏在自身内部是一个复杂的内部结构。 这种复杂的结构不能直接访问,因此不会有被破坏的风险。 它只能通过公共方法访问,这使得它们的工作很好并且不会破坏复杂的内部结构。 例如,我们无法直接访问HashMap的哈希表,也无法破坏它。 我们只使用getput方法,正确地关注哈希表状态。 但是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM