Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当使用组合而不是继承时,比较器的替代方案是什么?_Java_Sorting_Inheritance_Collections_Composition - Fatal编程技术网

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&

在重构Java项目以使用组合而不使用继承时,我仍然存在一个问题,即对集合执行多态排序

继承示例:

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的长度,用受保护的作用域成员替换。