比较实现Comparable的对象更优雅的方式

我有以下对象(假设类Rank实现了Comparable):

Rank rankA; Rank rankB; 

我会比较他们这样的:

 if(rankA.compareTo(rankB) < 0) // rankA < rankB doSomething(); 

要么

 if(rankA.compareTo(rankB) == 0) // rankA == rankB doSomething(); 

要么

 if(rankA.compareTo(rankB) > 0) // rankA > rankB doSomething(); 

我发现上面的这些陈述很难阅读,即使增加了评论。 有没有更优雅,更可读的解决方案? 我知道我可以为此实现一个方法,但是我正在寻找一个最好已经实现的解决方案,所以我不必创建一个util方法。

那么,在很多编程语言(而不仅仅是Java)中的传统方式是比较函数返回一个数字,如果第一个出现在第二个之前,则为负;如果两个都应该被认为是相等的,则为零;如果第一个是在第二个之后。

你可以做什么,如果你喜欢的是添加自己的方法,例如:

 boolean isBefore(Rank rank) { return this.compareTo(rank) < 0; } boolean isSame(Rank rank) { return this.compareTo(rank) == 0; } boolean isAfter(Rank rank) { return this.compareTo(rank) > 0; } 

你甚至可以用默认方法创建你自己的通用接口:

 public interface EasyComparable<C> extends Comparable<C> { default boolean isBefore(C that) { return this.compareTo(that) < 0; } default boolean isSame(C that) { return this.compareTo(that) == 0; } default boolean isAfter(C that) { return this.compareTo(that) > 0; } } 

然后让您的Rank实现EasyComparator而不是Comparator

那么你将能够做到:

 if (rankA.isBefore(rankB)) { doSomething(); } else if (rankA.isSame(rankB)) { doSomething(); } else if (rankA.isAfter(rankB)) { doSomething(); } 

然后,您将可以在其他对象上执行此操作,而不仅仅是Rank

如果你对Rank类没有控制权,你也可以扩展Comparator ,也可以添加3个默认的方法,但是它们必须有两个参数,而不是一个。

也许不是你想要的答案,但你可以用Kotlin来代替。 在这里,您可以编写类似于您在评论中提到的代码:

 fun main(args: Array<String>) { val s1 = "aaaa" val s2 = "bbbb" val s3 = "cccc" println("s1 < s2: ${s1 < s2}") println("s1 == s2: ${s1 == s2}") println("s1 < s2: ${s1.compareTo(s2) < 0}") println("s1 > s2: ${s1 > s2}") println("s3 > s2: ${s3 > s2}") } 

s1 < s2实际上是s1.compareTo(s2) < 0

所以Kotlin解决了你提到的问题。

上面代码的输出:

 s1 < s2: true s1 == s2: false s1 < s2: true s1 > s2: false s3 > s2: true 

你的代码是好的。 我会用它如下:

 int result = rankA.compareTo(rankB); if(result == 0) { //do sth } else if (result <0) { //do sth } else { //do sth } 
Interesting Posts