Java三元运算符vs if / else in <jdk8 compatibility =“”

时间:2015-09-09 08:56:07

标签: java java-8 ternary-operator

=“”

最近我正在阅读Spring Framework的源代码。我无法理解的东西在这里:

public Member getMember() {
    // NOTE: no ternary expression to retain JDK <8 compatibility even when using
    // the JDK 8 compiler (potentially selecting java.lang.reflect.Executable
    // as common type, with that new base class not available on older JDKs)
    if (this.method != null) {
        return this.method;
    }
    else {
        return this.constructor;
    }
}

此方法是类org.springframework.core.MethodParameter的成员。代码很容易理解,而评论很难。

  

注意:即使使用JDK 8编译器(也可能选择java.lang.reflect.Executable作为常见类型,并且旧的JDK上没有新的基类),也没有三元表达式来保留JDK&lt; 8兼容性。

在此上下文中使用三元表达式和使用if...else...构造之间的区别是什么?

2 个答案:

答案 0 :(得分:30)

这是在quite old commit于2013年5月3日推出的,差不多在官方JDK-8发布前一年。编译器在那些时候处于大量开发阶段,因此可能会出现这种兼容性问题。我猜,Spring团队刚刚测试了JDK-8版本并尝试修复问题,即使它们实际上是编译器问题。通过JDK-8官方发布,这变得无关紧要。现在,此代码中的三元运算符正常工作(在编译的.class文件中没有引用Executable类)。

目前在JDK-9中出现了类似的东西:JDK-8中可以很好地编译的一些代码使用JDK-9 javac失败了。我猜,大多数此类问题将在发布之前修复。

答案 1 :(得分:7)

主要区别在于if else块是语句而三元组(在Java中通常称为条件运算符)是表达式

语句可以在某些控制路径上向调用者执行return之类的操作。 表达式可用于作业:

int n = condition ? 3 : 2;

因此条件之后的三元中的两个表达式需要可强制转换为相同类型。这可能会导致Java中的一些奇怪的效果,尤其是自动装箱和自动参考投射 - 这就是您发布的代码中的注释所指的内容。在您的情况下,表达式的强制将是java.lang.reflect.Executable类型(因为最专业的类型),并且在旧版本的Java中不存在。

在风格上,如果代码类似于语句,则应使用if else块;如果类似于表达式,则应使用三元组。

当然,如果使用lambda函数,可以使if else块的行为类似于表达式。