Dan*_*ler 8 java eclipse templates defensive-programming
最近我在FindBugs上发布了关于暴露内部状态的警告,即当返回对数组的引用而不是返回数组的副本时.我创建了一些模板,以便更容易地转换代码.
您创建了哪一个支持防御性编程并希望与SO人群分享?
我到目前为止创建的模板(作为示例):
要创建要从方法返回的数组的副本,请执行以下操作:
final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );
Run Code Online (Sandbox Code Playgroud)
要克隆对象:
(${o}!= null?(${type})${o}.clone():null)
Run Code Online (Sandbox Code Playgroud)
我喜欢将“更安全”的 equals() 定义作为模板:
/**
* Implement equals based on ${cursor}. <br />
* See {@link #compareTo(Object) compareTo}
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(final Object anObject)
{
boolean res = false;
if(anObject == null) { return false; }
if(anObject == this) { return true; }
if(anObject.getClass() == this.getClass())
{
res = this.compareTo(anObject) == 0;
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
确保始终避免Eq: equals 方法覆盖超类中的 equals 并且可能不对称( EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC),其中:
此类定义了一个 equals 方法,该方法重写超类中的 equals 方法。两种 equals 方法都使用 instanceof 来确定两个对象是否相等。
这充满了危险,因为 equals 方法是对称的(换句话说,
a.equals(b) == b.equals(a))非常重要。
如果B是 的子类型A,并且A的 equals 方法检查参数是否为 aninstanceof A,而 B 的 equals 方法检查参数是否为 aninstanceof B,则这些方法定义的等价关系很可能不是对称的。
这仅适用于实现Comparable并允许以下功能的类:
compareTo());Comparable#compareTo()要求确保的javadoc (x.compareTo(y)==0) == (x.equals(y))(强烈建议,但不严格要求)。