Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防御性编程的编辑器模板_Java_Eclipse_Templates_Defensive Programming - Fatal编程技术网

Java 防御性编程的编辑器模板

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

最近我研究了FindBugs关于公开内部状态的警告,即当返回对数组的引用而不是返回数组的副本时。我创建了一些模板,使转换代码更容易

您创建了哪一个来支持防御性编程,并希望与这么多人分享

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

要创建从方法返回的数组副本,请执行以下操作:

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()操作以执行一些讨厌的操作,对吗?如果是这样,我应该相应地调整克隆模板。。。有什么建议吗?哇!我使用了一些代码生成特性,但我没有看到“生成委托方法”。我现在觉得自己很愚蠢,因为我重新发明了方向盘。