返回首页
当前位置: 主页 > Java&XML > XMLBeans >

应用技巧:提高Java Beans的方法(下)

时间:2009-07-21 18:54来源:未知 作者:admin 点击:
首先,值要比name和dob要普遍。最普遍的似乎是把fields命名为first和 second: public class Pair { public final String first; public final Date second; public Pair(String first, Date second) { this.first = first; this.sec
  

首先,值要比name和dob要普遍。最普遍的似乎是把fields命名为first和 second:

         public class Pair {
  public final String first;

  public final Date second;

  public Pair(String first, Date second) {

  this.first = first;

  this.second = second;

  }

  }
 
  到目前为止一起都很顺利。你现在有一个大致的类来返回Strings 和Dates,但不是其他的类型。如下:

         public class Pair {
  public final A first;

  public final B second;

  public Pair(A first, B second) {

  this.first = first;

  this.second = second;

  }

  }
 
  不必去担心通配符这些东西只是代码一但返回类型的一个快捷方式。这个类现在可用于general type pairs,例如:

         public static Pair lookupBySSN(String ssn) {
  // find the person in the DB....

  return new Pair(person.getName(), new Date(person.getDOB().getTime()));

  }

  使用它:

  Pair personNameDOB = SSNLookup.lookupBySSN("123-45-6789");

  System.out.println(personNameDOB.first);

  System.out.println(personNameDOB.second);
 
  你用的Pair 类还没有结束。如果这个事情真的具有普遍性,你需要考虑一些事情:

  · 你不想别人来扩展Pair class并改变它所做的事情——有肯能打破的类的原本意图。

  · new Pair()可以,但是它看上去有点笨拙。你可以做到比它还要好。

  · Pair对返回的值很有用,但是作用很小,例如,作为地图中的答案。

  · 有一个很好的形式的Pair字符串代表是相当不错的可以进行调试或是其他toString()使用。

  · 最后,也许(这是有争议的),让Pair和包含的对象序列化如果内容也序列化那将是非常好的。

 

所以,让我们看一下pair执行时如何变化的:

         public final class Pair implements Serializable {
  private static final long serialVersionUID = 1L; // shouldn't

  // need to change

  public final A first;

  public final B second;

  private Pair (A first, B second) {

  this.first = first;

  this.second = second;

  }

  public static Pair of (A first, B second) {

  return new Pair(first,second);

  }

  @Override

  public boolean equals(Object obj) {

  if (obj == null) {

  return false;

  }

  if (getClass() != obj.getClass()) {

  return false;

  }

  final Pair other = (Pair) obj;

  if (this.first != other.first &&

  (this.first == null || !this.first.equals(other.first))) {

  return false;

  }

  if (this.second != other.second &&

  (this.second == null || !this.second.equals(other.second))) {

  return false;

  }

  return true;

  }

  @Override

  public int hashCode() {

  int hash = 7;

  hash = 37 * hash + (this.first != null ?

  this.first.hashCode() : 0);

  hash = 37 * hash + (this.second != null ? this.second.hashCode() : 0);

  return hash;

  }

  @Override

  public String toString () {

  return String.format("Pair[%s,%s]", first,second);

  }

  }
 
  你应该让constructor很秘密的,但是提供一个静态的of()方法,我想读起来会更好:

  return Pair.of(person.getName(), new Date(person.getDOB().getTime()));

  你把Pair类放最后,所以没人会不理它并且改变类的原本意图。这看起来很严格,但是为了更广泛使用的目的,防范这样的事情是十分明智的。如果有人像让Pair做不同的工作,他们需要写入自己的执行,向同行证明它是有道理的。

  equals()和hashCode()方法说明这个类能够用于更多的目的而不仅仅是返回值。他们可用于,例如,作为地图的关键点。这有一个建议,是对使用这个样式的任何类型的返回对象,是让你的IDE为你创建equals和hashCode方法——这些是简单的实现但是这里有要记住的一些事情是关于hashCode 和equals的合同,例如,null checks和不同的types(参见在Josh Bloch的Effective Java 2nd ed书中关于明确的描述)。IDEs往往有插入最好的已定义的练习样板,所以我只用NetBeans来创建这些。也许它们可以再精简一点,但是这些执行是很安全的。我从NetBeans equals()执行中删除通用签名,因为它没有必要了而且会制造疑惑。

  toString()覆盖了刚刚打印的一个漂亮格式的pair,像"Pair[Fred Jones,Sun Mar 22 12:55:44 PDT 2009]"。这个特别用于调试的popups。

  现在类完成序列化。我相信这点是选择变得更不可相信的一点,但是因为collection序列化,在我看来Pair也应该序列化。如果类在没有序列化的Pair中使用,Pair就不是阻止序列在类中使用的东西了。
 

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
发布者资料
admin 查看详细资料 发送留言 加为好友 用户等级:高级会员 注册时间:2009-06-09 07:06 最后登录:2009-08-19 21:08
推荐内容