我必须比较自定义类的对象,比如A。
比较是基于A的int成员(如mem )的比较。
因此,在比较器的实现中,我可以这样做:
(A a1, A a2) -> {return (Integer)a1.getMem().compareTo(a2.getMem());}或者,我可以自己做比较:
(A a1, A a2) -> {
if(a1.getMem() > a2.getMem()){
return 1;
}else{
if(a1.getMem() < a2.getMem()) {
return -1;
}else{
return 0
}
}
}哪一种方法更好?
第一种方法的代码行要少得多,但在内部,compareTo所做的与我们在第二种方法中所做的相同。
发布于 2019-05-12 06:58:16
发布于 2019-05-12 07:00:00
走第一条路。它比一堆if语句和返回神奇的数字更易读(我们如何比较两个A?compare它们的getMem)。此外,使用像compareTo这样的库中的方法比自己编写一堆比较逻辑更容易出错。想象一下,将-1错误地输入为1,或者将<错误地键入为>。
但是,还有一个更好的方法:
Comparator.comparingInt(A::getMem)发布于 2019-05-12 07:41:44
要达到“好”的代码基础,最基本的规则之一是:像瘟疫一样避免代码复制!
这不仅仅是为了编写最小数量的代码来解决问题。它实际上是关于:在多个地方没有相同的逻辑。
为什么?因为当您决定在某一时刻更改该逻辑时,您必须记住更新包含该逻辑的所有位置。
有研究表明,在较大的项目中的代码重复迟早会导致有多个几乎相同的克隆的某些逻辑。你猜怎么着:这就是臭虫的藏身之处。你复制了10行中的9行,并在这9行中做了一个细微的修改。或者您只是添加了一个bug,或者您修复了这9行中的一个问题,而不是原来的10行。现在,代码中的两个位置所做的事情略有不同。很少有好事。
所以,遵循另外两个答案,但要明白为什么你要这么做。
毫无疑问:在某一时刻,您可能会决定这个compareTo实现不再是您所需要的。然后把它改成别的东西,然后把它完整地写在这个地方是很好的。但是直到那一天:重用那些已经存在的代码!
https://stackoverflow.com/questions/56096845
复制相似问题