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

时间:2013-11-26 06:24:58

标签: java awt

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

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

3 个答案:

答案 0 :(得分:3)

我认为暴露公共字段并不违反封装本身。封装是实体的属性,隐藏在自身内部是一个复杂的内部结构。这种复杂的结构不能直接访问,因此不会有被破坏的风险。它只能通过公共方法访问,这使得它们的工作很好并且不会破坏复杂的内部结构。例如,我们无法直接访问HashMap的哈希表,我们也无法破坏它。我们只使用getput方法,它们正确地处理哈希表状态。但是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的防御性副本。失去所有“优点”,加上,烦人和错误的来源。