Java 当使用组合而不是继承时,比较器的替代方案是什么?
在重构Java项目以使用组合而不使用继承时,我仍然存在一个问题,即对集合执行多态排序 继承示例:Java 当使用组合而不是继承时,比较器的替代方案是什么?,java,sorting,inheritance,collections,composition,Java,Sorting,Inheritance,Collections,Composition,在重构Java项目以使用组合而不使用继承时,我仍然存在一个问题,即对集合执行多态排序 继承示例: public class AClass { private List<OneClassOfManyThatRequireSortedInstances> unsortedList; public List<OneClassOfManyThatRequireSortedInstances> getSortedList() { List&
public class AClass
{
private List<OneClassOfManyThatRequireSortedInstances> unsortedList;
public List<OneClassOfManyThatRequireSortedInstances> getSortedList()
{
List<OneClassOfManyThatRequireSortedInstances> sortedList = new ArrayList(this.unsortedList);
Collections.sort(sortedList, SuperClassOfManyThatRequireSortedInstances.orderComparator);
return sortedList;
}
}
问题的关键是,在重构到组合之后,一个需要状态的人的类不再是一个需要状态的人的超类,因此代码被破坏了
许多类,例如需要RestoredInstance的Many类,不再具有公共父类。因此,Collections.sort不能在这些类中仅使用一个Comparator实现。
现在,像OneClassOfManyThreatResortedInstances这样的类有一个SuperClassOfManyThreatResortedInstances成员;a有关系 您可以有一个contract by接口,其中有一些排序方法,这些方法基于一组特定的字段(如使用的超类)返回。然后,您可以有一个类进行排序计算,另一组类根据不同的字段/组合集进行排序
然后,您只需传递一个比较器实例,它将执行所需的排序,它将检查instanceof。。。如果未实现特定接口,您可以选择抛出错误或日志,并安静地返回默认值。您可以拥有一个按接口约定的方法,其中有某些排序方法,这些方法基于特定字段集(如所使用的超类)返回。然后,您可以有一个类进行排序计算,另一组类根据不同的字段/组合集进行排序
然后,您只需传递一个比较器实例,它将执行所需的排序,它将检查instanceof。。。如果未实现特定接口,您可以选择抛出错误或日志,并安静地返回默认值。假设有两个类,Car和Train。您可以创建一个像
public interface SpeedProvider {
int getSpeed();
}
然后,汽车和火车都实现了SpeedProvider接口
public class Car implements SpeedProvider {
int maxSpeed = 220;
@Override
public int getSpeed() {
return maxSpeed;
}
}
public class Train implements SpeedProvider {
int maxSpeed = 300;
@Override
public int getSpeed() {
return maxSpeed;
}
}
最后,您可以实现一个比较器来比较两个SpeedProvider
假设有两类,汽车和火车。您可以创建一个像
public interface SpeedProvider {
int getSpeed();
}
然后,汽车和火车都实现了SpeedProvider接口
public class Car implements SpeedProvider {
int maxSpeed = 220;
@Override
public int getSpeed() {
return maxSpeed;
}
}
public class Train implements SpeedProvider {
int maxSpeed = 300;
@Override
public int getSpeed() {
return maxSpeed;
}
}
最后,您可以实现一个比较器来比较两个SpeedProvider
这个问题没有意义。比较器用于合成。使用继承时的替代方法具有可比性。你的问题前后颠倒。这个问题没有意义。比较器用于合成。使用继承时的替代方法具有可比性。您的问题是背对背的。orderComparator的签名看起来像什么?请尽可能降低它的工作效率。提取一个公开所需方法的接口,并使用于从超类型继承的所有类实现它。上面Zutty的注释是一个简单的解决方案。orderComparator看起来像签名吗?尽可能少地使其工作。提取一个公开所需方法的接口,并使用于从超类型继承的所有类实现它。上面Zutty的注释是一个简单的解决方案。好的,这种方法有效,谢谢。我已经为该成员提供了一个接口,所以我只是使用了它。这意味着我还必须实现访问器方法,这也是我之前忽略的,以直观地减少链式getter的长度,用受保护的作用域成员替换。好的,这种方法有效,谢谢。我已经为这个成员提供了一个接口,所以我只是使用了它。这意味着我还必须实现访问器方法,我以前忽略了这些方法,以直观地减少链式getter的长度,用受保护的作用域成员替换。