在Java中扩展现有对象以实现Comparable

时间:2012-02-03 21:39:50

标签: java comparable

目前我的问题是我需要使用一个我不允许更改的现有框架,解决我的问题最方便的方法是使用Comparable对象。假设我有一个对象Foo,它没有实现Comparable,我不允许进入并更改它以使其可比较。我的想法是只使用Bar,它扩展了Foo并实现了Comparable。

public class Bar extends Foo implements Comparable
{
   public int compareTo( Object o)
   {
      Foo f = (Foo) o;
      if( this.getID() < f.getID() ) return -1;
      else if ( this.getID() == f.getID() ) return 0;
      else return -1;
   }
}

但是假设我在某个地方得到了Foo的一个实例。如何将其变成Bar的实例?是否有针对这种情况的推荐替代解决方案?

3 个答案:

答案 0 :(得分:5)

如果您绝对需要Comparable而非Comparator,请使用装饰器(如其他人所述)

public class ComparableFoo implements Comparable<ComparableFoo> {

   final Foo foo;

   public ComparableFoo(Foo foo) {
      this.foo = foo;
   }

   @Override
   public int compareTo(ComparableFoo o) {
      Foo other = o.foo;
      // do comparison here, e.g.
      return foo.getDate().compareTo(other.getDate());
   }

}

请注意,ComparableFoo不需要扩展Foo。在某些情况下,这可能是好的,但不是一个要求。如果你真的想要了解底层的Foo,你可以在一个字段中使用它,你可以访问该字段,或者提供正式的访问者。

答案 1 :(得分:1)

装饰器模式可能会起作用。然而,这是以额外装箱对象为代价的,所以如果你有很多物体,我就不会使用它。

如果可以,使用Comparator实际上要简单得多。实际上,它为您提供了一些其他选项,您无法使用Comparable,例如定义替代排序顺序。

还要考虑使用泛型。它不仅仅是一个让代码更复杂的玩具,它实际上有助于防止某些类型的错误发现,因为它们通常“大多数”都可以工作,然后在添加子类时突然开始失败。

答案 2 :(得分:0)

http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

您可以使用Java Collections框架和Comparator对类进行排序。