是否使用compareTo

时间:2019-05-12 06:48:25

标签: java comparator

我必须比较自定义类的对象,例如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所做的与第二种方法相同。

3 个答案:

答案 0 :(得分:7)

通常最好不要重新发明轮子。因此,第一种方法更好。

您甚至可以使用Comparator.comparingInt编写更少的代码:

Comparator.comparingInt(A::getMem)

答案 1 :(得分:4)

采用第一种方法。它比一堆if语句和返回魔术数更易读(我们如何比较两个Acompare他们的getMem)。另外,使用compareTo之类的库中的方法比自己编写一堆比较逻辑要容易出错。想象一下,将-1误输入为1或将<误输入为>

但是,还有一种更好的方法:

Comparator.comparingInt(A::getMem)

答案 2 :(得分:1)

获取“良好”代码库的最基本规则之一:避免像瘟疫一样重复代码重复

不仅要编写最小数量的代码来解决问题。的确是关于:在一个以上的地方没有相同的逻辑。

为什么?因为当您决定在某个时候更改该逻辑时,您必须记住要更新包含该逻辑的所有位置。

一些研究表明,大型项目中的代码重复迟早会导致某些逻辑部分具有多个几乎相同的克隆。猜猜是什么:那就是错误隐藏的地方。您从10行中复制了9行,然后在这9行中进行了微妙的修改。您要么添加了一个错误,要么解决了这9行中的问题,但没有解决原始的10行中的问题。现在,您的代码中的两个地方所做的事情略有不同。很少是一件好事。

因此,请遵循其他两个答案,但要了解为什么为什么

并且不要出错:在某个时候,您可能会决定不再需要这个compareTo实现。然后,将其更改为其他内容,并在该位置完整地写下即可。但是直到那一天:重新使用已经存在的代码!