2017-10-12 83 views
0

我有以下对象(假设班级排名实现可比):比较执行对象的更优雅的方式可比

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(); 

我发现上面的if语句难以阅读,即使增加了注释。是否有更优雅,更可读的解决方案?我知道我可以实现这个方法,但我期待对于用于优选已经实施的解决方案,所以我没有创建一个实用程序,方法。

+0

其实我不觉得这么难读。试想用右边的操作符代替'compareTo'。 – Henry

回答

0

也许不是你想要的答案,但你可以用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

所以科特林讨论你提到的问题。

输出上面的代码:

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

你的代码是好的。我想,如下使用它:

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

那么,在大量的编程语言(而不仅仅是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个默认方法,但它们必须使用两个参数而不是一个参数。