快速业务通道

java api接口篇(二)下 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

java api接口篇(二)下

时间:2010-12-24

编写你自己的Comparable类型

Comparable 接口由一个单一的方法构成:

public interface Comparable { public int compareTo(Object o); }

compareTo 方法将接收对象与特定对象进行比较,并在接收对象小于、等于或大于特定对象时分别返回负整数、空或一个正整数。如果特定对象不能与接收对象相比较,该方法扔出一个ClassCastException. 这是一个表示某人姓名的类(a class representing a person"s name), 它实现了 Comparable:

import java.util.*; public class Name implements Comparable { private String firstName, lastName; public Name(String firstName, String lastName) { if (firstName==null || lastName==null) throw new NullPointerException(); this.firstName = firstName; this.lastName = lastName; } public String firstName() {return firstName;} public String lastName() {return lastName;} public boolean equals(Object o) { if (!(o instanceof Name)) return false; Name n = (Name)o; return n.firstName.equals(firstName) && n.lastName.equals(lastName); } public int hashCode() { return 31*firstName.hashCode() + lastName.hashCode(); } public String toString() {return firstName + " " + lastName;} public int compareTo(Object o) { Name n = (Name)o; int lastCmp = lastName.compareTo(n.lastName); return (lastCmp!=0 ? lastCmp : firstName.compareTo(n.firstName)); } }

为了使这个例子短一些,该类受到了一点限制:它不支持中间名,它要求必须同时具有first name 和 last name, 而这不是在全世界都通用的。尽管如此,这个例子仍有几个重要之处:

Name 对象是不变的( immutable)。作为相等、不变类型的所有其它事情就是如何做的问题,特别是对那些将被用来作为 Sets 中的元素或 Maps 中的键的对象来说,更是如此。如果你对这些 对象集 中的元素或键做了更改,这些 对象集 将中断。

java api接口篇(二)下(2)

时间:2010-12-24

构造函数可检查它的参数是否为 null。这可以保证所有的Name 对象都能很好地形成。因而没有其它方法会? NullPointerException.

hashCode 方法被重新定义。对重新定义 equals 方法的任意类来说,这是必需的(essential)。一般约定(general contract)需要 Object.equals. (Equal 对象必须具有相等的哈希代码) 。

如果特定对象为 null,或一个不适当的类型, equals 方法则返回 false。在这种情况下, compareTo 方法扔出一个运行时异常。这两个行为都是各自方法的一般约定所必需的。

toString 方法已被重新定义,从而可以以人们能够读懂的形式打印 Name 。这总是一个好主意,特别是对要被放入对象集 中的对象来说,更有益处。各种 对象集 类型的 toString 方法依赖它们的元素、键和值的 toString 方法。

由于这一节介绍的是有关元素排序的问题,因而让我们稍微多谈一点 Name 的 compareTo 方法。它实现标准的姓名-排序算法,在该算法中,last name 优先于 first name。这恰恰是你在一个natural ordering(自然排序)中所想要的。如果自然排序不自然,那才容易引起混乱呢!  

请看 compareTo 是如何被实现的,因为它是相当典型的。首先,你将 Object 参数转换为适当类型; 如果参数类型是不适当的,则会扔出一个适当的异常(ClassCastException);那么你应该比较对象的最重要部分(在此案例中为 last name)。通常,你可以使用该部分的类型的自然排序。在次案例中,该部分是一个 String, 并且自然的(按词典顺序的)排序正是所要求的。如果比较

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号