public class WorthComparator implements Comparator<Värdesak> {
    public int compare(Värdesak v1, Värdesak v2) {
        if (v1 instanceof Apparat && v2 instanceof Apparat) {
            return ((Apparat) v1).worth() > ((Apparat) v2).worth() ? 1
                    : ((Apparat) v1).worth() < ((Apparat) v2).worth() ? -1
                            : 0;
        } else if (v1 instanceof Smycke && v2 instanceof Smycke) {
            return ((Smycke) v1).worth() > ((Smycke) v2).worth() ? 1
                    : ((Smycke) v1).worth() < ((Smycke) v2).worth() ? -1
                            : 0;
        } else if (v1 instanceof Aktie && v2 instanceof Aktie) {
            return ((Aktie) v1).worth() > ((Aktie) v2).worth() ? 1
                    : ((Aktie) v1).worth() < ((Aktie) v2).worth() ? -1 : 0;
        }
    }
}


如您所见,我正在尝试比较ArrayList中的不同对象,然后按最高值在我的GUI中对它们进行排序。每个不同的对象(“ Smycke”,“ Aktie”,“设备”)都在各自的子类中,每个子类都有一种估算其值的方法。“Värdesak”是超类。

我的问题是我不知道该向谁申报退货,还是有另一种明智的方式来做到这一点?

最佳答案

在我看来,您的代码设计错误,或者您以错误的方式应用代码。由于每个“Värdesak”都值钱,因此您可以/需要在Värdesak级别定义此方法:

public abstract class Värdesak {

    public abstract double worth ();

}


接着:

public class Apparat extends Värdesak {

    @Override
    public double worth () {
        return 500.0d;
    }

}


或者,如果价格固定,则可以使用一个字段:

public abstract class Värdesak {

    private double value;

    public double worth () {
        return worth;
    }

}


现在,您可以简单地使用动态绑定原理:

public class WorthComparator implements Comparator<Värdesak> {

    public int compare(Värdesak v1, Värdesak v2) {
        return Double.compare(v1.worth(),v2.worth());
    }

}


instanceof calls are in general considered to be a bad smell:如果必须使用它们,那么代码的设计通常会有问题。

另一个建议,请不要在标识符中使用Unicode字符:使用Vardesak代替Värdesak

关于java - 具有多个子类的ArrayList对象的比较器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29409890/

10-13 05:00