如何覆盖compareTo方法

时间:2010-08-13 09:27:28

标签: java

这是我的compareTo方法,但我仍然得到“缺少返回语句”警告。 谁能告诉我我的代码有什么问题?

    public int compareTo(Flows other) {
    if(this.srcAddr.equals(other.srcAddr)){
        if(this.dstAddr.equals(other.dstAddr)){
                 if(this.srcPort.equals(other.srcPort)){
                     if(this.dstPort.equals(other.dstPort)){
                         if(this.protocol.equals(other.protocol)){
                             return 0;
                         }
                     }
                 }
         }
 }
}

5 个答案:

答案 0 :(得分:5)

两件事:

  • 您将获得“缺少返回语句”,因为存在未返回任何值的执行路径。例如,当第一个if语句计算为false时。

  • 您违反了compareTo()合约。对于以下调用:a.compareTo(b),结果:如果a等于b,则为0;如果a小于b,则为< 0;如果a大于b,则为> 0 。看来你正在使用compareTo()检查是否相等,在这种情况下,正确的方法是覆盖equals()方法。

答案 1 :(得分:2)

这看起来像一个等于方法。如果意图只是比较两者是否相同,我会做类似

的事情
return srcAddr.equals(other.srcAddr) &&
       dstAddr.equals(other.dstAddr) &&
       srcPort.equals(other.srcPort) &&
       dstPort.equals(other.dstPort) &&
       protocol.equals(other.protocol);

如果意图,您可能违反了compareTo的合同,因为您的方法似乎不符合传递要求。来自Comparable的文档:

  

实现者还必须确保关系是可传递的

答案 2 :(得分:1)

这是因为在您的代码中,compareTo有可能不返回任何内容!想想如果所有这些if语句都失败了,那么它将触及方法的结尾并且没有返回任何内容。你需要进一步回归:

public int compareTo(Flows other) {
  if(this.srcAddr.equals(other.srcAddr)){
      if(this.dstAddr.equals(other.dstAddr)){
          if(this.srcPort.equals(other.srcPort)){
              if(this.dstPort.equals(other.dstPort)){
                  if(this.protocol.equals(other.protocol)){
                      return 0;
                  }
              }
          }
      }
  }
  return 1;

}

此外,您还没有进行完整的比较。如果它们相等则需要返回0,如果差值小于0则需要返回0,如果差值大于0则需要返回0。它看起来你最好等于压倒平等!

可能是这样的:

public boolean equals(Flows other) {
    return (this.srcAddr.equals(other.srcAddr) && this.dstAddr.equals(other.dstAddr) && this.srcPort.equals(other.srcPort) && this.dstPort.equals(other.dstPort) && this.protocol.equals(other.protocol));

答案 3 :(得分:0)

只需在函数末尾添加“返回1”(或任何内容),它就可以解决问题。

答案 4 :(得分:0)

这将编译并运行,但合同的其余部分呢?哪里小于和大于?

public int compareTo(Flows other) {

    int value = 0;

    if(this.srcAddr.equals(other.srcAddr)){
        if(this.dstAddr.equals(other.dstAddr)){
                 if(this.srcPort.equals(other.srcPort)){
                     if(this.dstPort.equals(other.dstPort)){
                         if(this.protocol.equals(other.protocol)){
                             value = 0;
                         }
                     }
                 }
         }

    return value;
 }