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,Apparat“)都在各自的子类中,每个子类都有一个估算其值的方法。”Värdesak“是超类。
我的问题是,我不知道我会向谁收到回复声明,还是有另一种聪明的方法可以做到这一点?
答案 0 :(得分:1)
在我看来,您的代码设计是错误的,或者您以错误的方式应用它。由于每个“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
。
答案 1 :(得分:1)
感谢所有好评。真的很适合它!我知道Unicode,当我清理代码时它肯定会被修复。你的意思是你重写的超类(值())中的“通用”方法会解决我的问题吗? 谢谢
答案 2 :(得分:0)
您也可以让Värdesak
实现Comparable接口
public abstract class Värdesak implements Comparable<Värdesak> {
//[...] your code
}
现在为每个类compareTo
Värdesak
public class Smycke extends Värdesak {
//[...] your code
@Override
public int compareTo(Server o) {
// TODO: your compare logic
return 0;
}
}
稍后您可以通过以下方式对Värdesaks进行排序:Collections.sort(värdesakList)
编辑:注意,此解决方案不像Comparator模式那么灵活。