防御性编程的编辑模板

时间:2008-12-17 12:03:22

标签: java eclipse templates defensive-programming

最近我在FindBugs上发布了关于暴露内部状态的警告,即当返回对数组的引用而不是返回数组的副本时。我创建了一些模板,以便更容易地转换代码。

你创建了哪一个支持防御性节目并希望与SO人群分享?

到目前为止我创建的模板(例如):

创建要从方法返回的数组副本:

final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );

克隆对象:

(${o}!= null?(${type})${o}.clone():null)

2 个答案:

答案 0 :(得分:3)

我喜欢将“更安全”的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;
}

一定要始终避免 Eq:equals方法覆盖超类中的equals并且可能不对称EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC),其中:

  

此类定义一个equals方法,该方法覆盖超类中的equals方法。两个equals方法方法在确定两个对象是否相等时使用instanceof。

     

这充满了危险,因为重要的是equals方法是对称的(换句话说,a.equals(b) == b.equals(a))。   如果BA的子类型,并且A的equals方法检查参数是instanceof A,并且B的equals方法检查参数是否为{{} 1}},这些方法定义的等价关系很可能不是对称的。


这仅适用于实现instanceof B的类,并允许:

  • equals的实现始终相同;
  • 所有比较逻辑仅位于一个地方(Comparable函数);
  • 遵守compareTo()的javadoc要求确保Comparable#compareTo()(强烈建议但不严格要求)。

答案 1 :(得分:2)

不是模板,但我使用array.clone()代替System.arraycopy()。那有什么不对吗?

编辑: 我在实现装饰器时使用的模板,特别是对于具有许多方法的接口:

wrapped.${enclosing_method}(${enclosing_method_arguments})

它通过将调用委托给包装实例来生成当前方法的实现,从而防止复制/粘贴错误。