Comparable VS Comparator
前言
在阅读TreeMap源码时发现了Comparable与Comparator,光是名字看起来就很像,既然都是比较器,那有何区别呢?实际上我对于比较器的使用场景并不是很多,所以这篇还是借鉴了别人的想法。
比较
通过下面的这段代码来说明问题。
public class Test {
public static void main(String[] args) {
Apple appleOne = new Apple(1, "red");
Apple appleTwo = new Apple(2, "green");
appleOne.compareTo(appleTwo);
}
}
class Apple implements Comparable<Apple> {
private int size;
private String color;
Apple(int size, String color){
this.size = size;
this.color = color;
}
@Override
public int compareTo(Apple o) {
return size > o.size ? 1 : 0; //比较Apple的大小
}
//getter、setter
}
代码上挺简单的,只是比较了Apple的大小,现在来思考一下,哪一天突然想比较Apple的颜色了,那岂不是要改代码了,而对于新需求我们通常说现有代码尽量保持不变,通过新增类的方式来满足,所以Comparable的缺点很明显,一旦某个类指定了比较方式后就无法做修改(除非是修改代码...),即使能修改代码我们也不知道会不会造成新的问题或新的需求产生,所以这是行不通的。而对于Comparator来说,它就显得更加灵活了,支持多个比较器,只要新增类即可,看如下的代码展示:
public class Test {
public static void main(String[] args) {
Apple appleOne = new Apple(1, "red");
Apple appleTwo = new Apple(2, "green");
//比较Apple的大小
AppleCompareSize acs = new AppleCompareSize();
acs.compare(appleOne, appleTwo);
//比较Apple的颜色
AppleCompareColor acc = new AppleCompareColor();
acc.compare(appleOne, appleTwo);
}
}
class Apple {
private int size;
private String color;
Apple(int size, String color) {
this.size = size;
this.color = color;
}
//getter、setter
}
class AppleCompareSize implements Comparator<Apple> {
@Override
public int compare(Apple o1, Apple o2) {
return o1.getSize() > o2.getSize() ? 1 : 0;
}
}
class AppleCompareColor implements Comparator<Apple> {
@Override
public int compare(Apple o1, Apple o2) {
return o1.getColor().compareTo(o2.getColor());
}
}
应该很容易就能看出效果了,即使别人已经写好了一个比较器,对于新需求,我们只要增加即可,并不会出现修改或污染其他人代码的情况。
总结
Comparator与Comaparable的最大区别在于Comparator能够定义多种不同的比较策略,即新增多个比较来,同时避免往比较对象(Apple)中添加其他代码(比较)
浙公网安备 33010602011771号