用于防御性编程的编辑器模板
-
22-08-2019 - |
题
最近我研究了关于暴露内部状态的 FindBugs 警告,即当返回对数组的引用而不是返回数组的副本时。我创建了一些模板来使代码转换变得更容易。
您创建了哪一个来支持防御性编程并希望与 SO 人群分享?
到目前为止我创建的模板(作为示例):
要创建数组的副本以从方法返回:
final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );
克隆对象:
(${o}!= null?(${type})${o}.clone():null)
解决方案
我喜欢将“更安全”的 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;
}
确保始终避免 等式:equals 方法覆盖超类中的 equals 并且可能不对称 (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC
), 在哪里:
此类定义了一个 equals 方法,该方法重写超类中的 equals 方法。两种 equals 方法都使用 instanceof 来确定两个对象是否相等。
这充满了危险,因为 equals 方法的对称性非常重要(换句话说,
a.equals(b) == b.equals(a)
).
如果B
是一个子类型A
, , 和A
的 equals 方法检查参数是否为instanceof A
, ,B 的 equals 方法检查参数是否为instanceof B
, ,这些方法定义的等价关系很可能不是对称的。
这仅适用于实现的类 Comparable
并允许:
- equals 的实现始终相同;
- 所有比较逻辑仅位于一处(
compareTo()
功能); - 符合 javadoc
Comparable#compareTo()
要求确保(x.compareTo(y)==0) == (x.equals(y))
(强烈推荐,但不严格要求)。
其他提示
不是一个模板,但我用array.clone()
代替System.arraycopy()
。这有什么不好呢?
编辑:
:执行一个装饰时,特别是对于具有许多方法的接口我使用的模板wrapped.${enclosing_method}(${enclosing_method_arguments})
有由呼叫委托给一个包装实例,从而防止复制/粘贴误差生成当前方法的实现。
不隶属于 StackOverflow