Java Eclipse生成equals方法:if(obj==null)vs.if(null==obj)
Eclipse喜欢生成带有Java Eclipse生成equals方法:if(obj==null)vs.if(null==obj),java,eclipse,code-generation,equals,Java,Eclipse,Code Generation,Equals,Eclipse喜欢生成带有null检查的equals方法(对于没有超类的类): if ( null == obj ) return false; 然而,我喜欢 if ( obj == null ) return false; 更多,因为它更具可读性。(这一直让我感到不安。) Q: 既然if(null==obj)是源于C/C++的过时实践,为什么Eclipse在obj之前生成null 两者之间有(运行时)差异吗?我只能推测 更新: EclipseKepler似乎会在(obj
null
检查的equals
方法(对于没有超类的类):
if ( null == obj )
return false;
然而,我喜欢
if ( obj == null )
return false;
更多,因为它更具可读性。(这一直让我感到不安。)
Q:
既然if(null==obj)
是源于C/C++的过时实践,为什么Eclipse在obj
之前生成null
两者之间有(运行时)差异吗?我只能推测
更新: EclipseKepler似乎会在(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;
}
}
我认为我们需要对开普勒之前生成的equals
方法进行一些清理。有些人编写null==obj
而不是obj==null
,因为键入=
而不是=
没有风险,但它不会改变代码的工作方式。请记住,在Java中,只有当obj是布尔值时,才可以编写obj=null
(无错误)。这种编写代码的方式来自其他编程语言,如C,在C中,错误地编写obj=null
是完全有效的。没有区别,Java中的约定(如果我们假设JDK是一个引用)是使用if(obj==null)
。例如,请参见对象的代码#requirennoull
:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
public static T requirennull(T obj){
if(obj==null)
抛出新的NullPointerException();
返回obj;
}
值得一提的是,如果(obj==null)返回false,Netbeans会自动生成等于代码>
无论您使用哪种方法,在运行时都不会产生任何影响,并将生成相同的字节码。您可以在Eclipse中修改生成equals方法的模板,请参阅以下内容
至于两者之间的运行时差异,我认为这两个表达式应该是相同的,因为编译器将以类似的方式优化这两个空检查表达式(即将生成相同的字节码)。更多的是关于人们喜欢使用什么惯例,而且因人而异。还有一些人喜欢大师级的尤达风格,你可以比较常量和变量
if(5==i)——Yoda风格如果Eclipse生成这种代码,为什么“键入”应该是一个参数呢?if(obj=null)
在Eclipse和任何正确的Java编译器中都会产生错误。键入if(obj=null)
的参数没有危险,因为Java编译器(Eclipse)会捕获它,请参阅您上面的注释。是的,但是,您是否为Boolean
类生成equals
方法?我只是说,一般来说,在Java中这是可能的,以及人们为什么使用它。对于equals方法,不可能犯这样的错误,所以生成了null==obj,因为这个模板的作者可能每次在每个类和方法中都是这样编写代码的。除了可读性之外,这种写作风格没有任何其他缺点,但我更喜欢编写obj==null。if(obj=null)
在Eclipse和任何正确的Java编译器中产生错误。您可能会得到答案“它必须是单向的,你认为更可读的并不一定是每个人都认为更可读的东西。”