Java理论与实践: 变还是不变? - 编程入门网
与实践: 变还是不变?(2)
时间:2010-12-21 IBM Brian Goetz
良好的键 不变对象产生最好的 HashMap 或 HashSet 键。有些可变对象根据其状态会 更改它们的 hashCode() 值(如清单 2 中的 StringHolder 示例类)。如果使 用这种可变对象作为 HashSet 键,然后对象更改了其状态,那么就会对 HashSet 实现引起混乱 ― 如果枚举集合,该对象仍将出现,但如果用 contains() 查询集合,它就可能不出现。无需多说,这会引起某些混乱的行为 。说明这一情况的清单 2 中的代码将打印“false”、“1”和“moo”。 清单 2. 可变 StringHolder 类,不适合用作键
Java理论与实践: 变还是不变?(3)时间:2010-12-21 IBM Brian Goetz何时使用不变类 不变类最适合表示抽象数据类型(如数字、枚举类型或颜色)的值。Java 类 库中的基本数字类(如 Integer 、 Long 和 Float )都是不变的,其它标准数 字类型(如 BigInteger 和 BigDecimal )也是不变的。表示复数或精度任意的 有理数的类将比较适合于不变性。甚至包含许多离散值的抽象类型(如向量或矩 阵)也很适合实现为不变类,这取决于您的应用程序。 Java 类库中不变性的另一个不错的示例是 java.awt.Color 。在某些颜色表 示法(如 RGB、HSB 或 CMYK)中,颜色通常表示为一组有序的数字值,但把一 种颜色当作颜色空间中的一个特异值,而不是一组有序的独立可寻址的值更有意 义,因此将 Color 作为不变类实现是有道理的。 如果要表示的对象是多个基本值的容器(如:点、向量、矩阵或 RGB 颜色) ,是用可变对象还是用不变对象表示?答案是……要看情况而定。要如何使用它 们?它们主要用来表示多维值(如像素的颜色),还是仅仅用作其它对象的一组 相关特性集合(如窗口的高度和宽度)的容器?这些特性多久更改一次?如果更 改它们,那么各个组件值在应用程序中是否有其自己的含义呢? 事件是另一个适合用不变类实现的好示例。事件的生命期较短,而且常常会 在创建它们的线程以外的线程中消耗,所以使它们成为不变的是利大于弊。大多 数 AW |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |