目前我的问题是我需要使用一个我不允许更改的现有框架,解决我的问题最方便的方法是使用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的实例?是否有针对这种情况的推荐替代解决方案?
答案 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对类进行排序。