Eclipse喜欢生成带有null
检查的equals
方法(对于没有超类的类),像这样:
if ( null == obj )
return false;
然而,我喜欢
if ( obj == null )
return false;
更多,因为它更具可读性。(这事总让我有点心烦。)
问:
为什么Eclipse在obj
之前生成null
,既然if ( null == obj )
是源自这里所描述的C/c++的过时实践?:
(obj == null) vs (null == obj)?
两者之间有任何(运行时)差异吗?我只能推测……
更新:
Eclipse Kepler似乎生成if ( obj == null )
,所以这只适用于以前的Eclipse版本。
public class Burp
{
private Long id ;
public Burp()
{
// test
}
}
类后:
public class Burp
{
private Long id ;
public Burp()
{
// test
}
// hashCode() omitted
@Override
public boolean equals( Object obj )
{
if ( this == obj )
return true;
if ( obj == null )
return false;
if ( getClass() != obj.getClass() )
return false;
Burp other = ( Burp ) obj;
if ( this.id == null )
{
if ( other.id != null )
return false;
}
else if ( !this.id.equals( other.id ) )
return false;
return true;
}
}
我认为我们需要对我们的pre-Kepler生成的equals
方法进行一些清理。
有些人用null == obj
代替obj == null
,因为用=
代替==
没有风险,但这不会改变代码的工作方式。请记住,在Java中,只有当obj是Boolean
时才有可能编写obj = null
(没有错误)。这种编写代码的方式来自于其他编程语言,如C语言,在这些语言中,错误地编写obj = null
是完全有效的。
您可以在Eclipse中修改生成equals方法的模板,参考以下链接
就两者之间的运行时差异而言,我认为这两个表达式应该是相同的,因为编译器会以类似的方式优化两个null检查表达式(即将生成相同的字节码)。更重要的是人们喜欢使用什么约定,这因人而异。
没有区别,Java中的约定(如果我们假设JDK是一个引用)是使用if (obj == null)
。例如Objects#requireNonNull
:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
值得注意的是,Netbeans会自动生成equals
和if (obj == null) return false;
。
无论您使用哪个,在运行时都不会产生差异,并且会生成相同的字节码。
还有一些人喜欢Master 尤达风格比较常量和变量
if (5 == i)——尤达风格