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

bhh*_*988 2 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

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

use*_*300 5

如果您绝对需要Comparable而不是Comparator,请使用Decorator(如其他人所述)

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());
   }

}
Run Code Online (Sandbox Code Playgroud)

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