Java 防御性编程的编辑器模板
最近我研究了FindBugs关于公开内部状态的警告,即当返回对数组的引用而不是返回数组的副本时。我创建了一些模板,使转换代码更容易 您创建了哪一个来支持防御性编程,并希望与这么多人分享 到目前为止我创建的模板(作为示例): 要创建从方法返回的数组副本,请执行以下操作:Java 防御性编程的编辑器模板,java,eclipse,templates,defensive-programming,Java,Eclipse,Templates,Defensive Programming,最近我研究了FindBugs关于公开内部状态的警告,即当返回对数组的引用而不是返回数组的副本时。我创建了一些模板,使转换代码更容易 您创建了哪一个来支持防御性编程,并希望与这么多人分享 到目前为止我创建的模板(作为示例): 要创建从方法返回的数组副本,请执行以下操作: final ${type}[] ${result} = new ${type}[ ${array}.length ]; System.arraycopy( ${array} , 0 , ${result} , 0 , ${arra
final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );
要克隆对象,请执行以下操作:
(${o}!= null?(${type})${o}.clone():null)
不是模板,但我使用
array.clone()
而不是System.arraycopy()
。这有什么问题吗
编辑:
我在实现装饰器时使用的模板,特别是对于具有许多方法的接口:
wrapped.${enclosing_method}(${enclosing_method_arguments})
它通过将调用委托给包装实例来生成当前方法的实现,从而防止复制/粘贴错误。我喜欢将“更安全的”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;
}
/**
*基于${cursor}实现equals
*参见{@link#compareTo(Object)compareTo}
*@see java.lang.Object#equals(java.lang.Object)
*/
公共布尔等于(最终对象anObject)
{
布尔res=false;
如果(anObject==null){return false;}
如果(anObject==this){return true;}
如果(anObject.getClass()==this.getClass())
{
res=this.compareTo(anObject)==0;
}
返回res;
}
要确保始终避免Eq:equals方法重写超类中的equals,并且可能不是对称的(Eq\u重写\u equals\u非对称的),其中:
此类定义一个equals方法,该方法重写超类中的equals方法。两种equals方法都使用instanceof来确定两个对象是否相等
这充满了危险,因为equals方法是对称的(换句话说,a.equals(b)==b.equals(a)
)非常重要
如果B
是a
的子类型,a
的equals方法检查参数是否为a
的实例,B的equals方法检查参数是否为B
的实例,则这些方法定义的等价关系很可能是不对称的
这仅适用于实现<代码>可比<代码>的类,并允许:
- 平等的实现,总是一样的李>
- 所有比较逻辑仅位于一个位置(
compareTo()
功能)李>
- 符合javadoc的
Comparable#compareTo()
要求确保(x.compareTo(y)==0)==(x.equals(y))
(强烈建议,但并非严格要求)
我将反转“布尔res”初始化和类相等性测试。然后可以将“else”代码移到“Then”子句中。我认为这样更容易理解,也更不容易出错。但是这个模板只有在类实现Comparable时才有效,对吗?你所有的类都实现了可比性吗?如果是这样的话,它的好处是什么?编码开销值得吗?为了扩展dhiller的要求,compareTo是否必须调用equals(),最终确定它是否应该返回正值、负值或零?我确实将它用于我的可比类,并在数组上导出compareTo()方法克隆中的任何比较逻辑都可以。在不受信任的非最终对象上克隆是一个问题,因为克隆可能会被重写以执行一些讨厌的/愚蠢的操作。这与源/生成委托方法不同吗?因此,java.util.Date的恶意编码子类可能会重写clone()操作以执行一些讨厌的操作,对吗?如果是这样,我应该相应地调整克隆模板。。。有什么建议吗?哇!我使用了一些代码生成特性,但我没有看到“生成委托方法”。我现在觉得自己很愚蠢,因为我重新发明了方向盘。