java使用逻辑运算符而不是if-else if返回

时间:2011-07-09 19:54:33

标签: java conditional return logical-operators

我在equals方法中有以下代码。

public boolean equals(Object o){
    if (o == null) return false;
    if (o == this) return true;
    if (!(o instanceof Vertex)) return false;
    return ((Vertex) o).label().equals(label);
}

我的IDE突出显示if语句,并希望我基本上这样做

public boolean equals(Object o){
    return (o != null) && ((o==this) || ((o instanceof Vertex) && ((Vertex) o).label().equals(label);
}

我被告知编译器通常足够智能以进行优化,并且通常应编写可读性代码。所以,显然第二个代码示例并不像第一个那么容易阅读。我的IDE是不是很烦人,或者这样做是否有一些实际的性能优势?

6 个答案:

答案 0 :(得分:2)

首先,只有在知道它是瓶颈时才进行优化,否则代码是为了便于阅读。

您可以检查字节代码以查看但我怀疑它们非常接近,如果不完全相同的话。即使字节码存在细微差别,我也看到JIT编译器将内容优化到没有差异的地方。您可以随时进行性能测试。

答案 1 :(得分:1)

大多数IDE都是可配置的,允许您指定它输出的样式警告的种类。你是正确的,根据生成的代码执行编译器建议的内容没有任何好处。编译器确实应该能够优化这些类型的东西。

答案 2 :(得分:1)

IDE建议的版本的性能优势几乎没有。此外,JVM(不仅是编译器)可以进行大量优化,这是正确的。

正如其他人指出的那样,试着达到可读性。您编写的代码由人类读取,并由Java编译器和虚拟机进行编译,修改和优化。

顺便说一下。一个简短的提示:您的代码可以更优化一点(省略null的相等条件,因为o保证在第二个条件之后是Vertex的实例):

public boolean equals(Object o){
    if (o == this) return true;
    if (!(o instanceof Vertex)) return false;
    return ((Vertex) o).label().equals(label);
}

答案 3 :(得分:0)

不要试图聪明地编译器。您正在为要阅读的人编写代码。让编译器担心将其转换为机器可读格式。

答案 4 :(得分:0)

这样做的好处是,如果你内联代码然后你可以很容易地将它分配给布尔值,但你也可以使用三元运算符使它更具可读性,这比优化版本更具可读性,但具有相同的功能,如果您学会了如何操作,可以帮助您稍后简化编码。

public boolean equals(Object o){
    return o == null || !(o instance of Vertex) ? false :
       o == this ? true :
       ((Vertex) o).label().equals(label);
}

这应该仍然可读。

我没有尝试编译这个,可能需要一些额外的括号,但我想要的概念不是你可以复制的东西。糊。

答案 5 :(得分:0)

为什么不测试自己的表现呢?这是一个示例:

public static long timeIt(Runnable runnable) {
    long start = System.nanoTime();
    runnable.run();
    long end = System.nanoTime();
    return end - start;
}

将为您运行run方法。所以你可以这样称呼它:

timeIt(new Runnable() { public void run() { OPERATION_TO_BE_TIMED; }})