目前我的问题是我需要使用一个我不允许更改的现有框架,解决我的问题最方便的方法是使用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的实例?是否有针对这种情况的推荐替代解决方案?
如果您绝对需要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,你可以在一个字段中使用它,你可以访问该字段,或者提供正式的访问者.
| 归档时间: |
|
| 查看次数: |
1221 次 |
| 最近记录: |