【问题标题】:Use compareTo or not是否使用 compareTo
【发布时间】:2019-05-12 06:48:25
【问题描述】:

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

【问题讨论】:

  • 我都不会使用,但Integer.compare(a1.getMem(), a2.getMem()) 也可以避免演员阵容。但通常使用第二种方法,并且(几乎)总是尝试使用现有的 API 来做你的事情,而不是重新发明轮子。这样可以避免出现错误,因为您无法将问题添加到比较算法中,就像方法 2 中可能发生的那样。

标签: java comparator


【解决方案1】:

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

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

Comparator.comparingInt(A::getMem)

【讨论】:

    【解决方案2】:

    选择第一种方法。它比一堆 if 语句和返回的幻数更具可读性(我们如何比较两个 As?compare 他们的 getMem)。此外,使用像compareTo 这样的库中的方法比自己编写一堆比较逻辑更不容易出错。想象一下,将-1 错误输入为1 或将&lt; 错误输入为&gt;

    但是,还有更好的办法:

    Comparator.comparingInt(A::getMem)
    

    【讨论】:

      【解决方案3】:

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

      这不仅仅是编写最少 量的代码来解决问题。这实际上是关于:在多个一个地方没有相同的逻辑。

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

      有研究表明,大型项目中的代码重复迟早会导致某些逻辑有多个几乎相同的克隆。猜猜看:这就是隐藏错误的地方。您从 10 行中复制 9 行,然后在这 9 行中进行细微修改。或者你只是添加了一个错误,或者你在这 9 行中修复了一个问题,但在原来的 10 行中没有。现在,您的代码中的两个地方做的事情略有不同。很少有好事。

      所以请遵循其他两个答案,但要了解为什么你应该这样做。

      别搞错了:在某些时候,您可能会决定不再需要此 compareTo 实现。然后将其更改为其他内容就完全可以了,并在此处将其完整地写下来。但直到那一天:重新使用已经存在的代码!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-02
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        • 2014-05-01
        • 1970-01-01
        • 2018-02-21
        • 1970-01-01
        相关资源
        最近更新 更多