快速业务通道

Java理论与实践: 变还是不变? - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
与实践: 变还是不变?(2) 时间:2010-12-21 IBM Brian Goetz

良好的键

不变对象产生最好的 HashMap 或 HashSet 键。有些可变对象根据其状态会 更改它们的 hashCode() 值(如清单 2 中的 StringHolder 示例类)。如果使 用这种可变对象作为 HashSet 键,然后对象更改了其状态,那么就会对 HashSet 实现引起混乱 ― 如果枚举集合,该对象仍将出现,但如果用 contains() 查询集合,它就可能不出现。无需多说,这会引起某些混乱的行为 。说明这一情况的清单 2 中的代码将打印“false”、“1”和“moo”。

清单 2. 可变 StringHolder 类,不适合用作键

public class StringHolder {      private String string;      public StringHolder(String s) {        this.string = s;      }      public String getString() {        return string;      }      public void setString(String string) {        this.string = string;      }      public boolean equals(Object o) {        if (this == o)          return true;        else if (o == null || !(o instanceof StringHolder))          return false;        else {          final StringHolder other = (StringHolder) o;          if (string == null)            return (other.string == null);          else            return string.equals(other.string);        }      }      public int hashCode() {        return (string != null ? string.hashCode() : 0);      }      public String toString() {        return string;      }      ...      StringHolder sh = new StringHolder("blert");      HashSet h = new HashSet();      h.add(sh);      sh.setString("moo");      System.out.println(h.contains(sh));      System.out.println(h.size());      System.out.println(h.iterator().next());    }

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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号