最近我正在阅读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...
构造之间的区别是什么?
答案 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
块的行为类似于表达式。