8

最近、内部状態の公開に関する FindBugs 警告に取り組みました。つまり、配列のコピーを返す代わりに配列への参照が返された場合です。そのコードを簡単に変換できるように、いくつかのテンプレートを作成しました。

防御的プログラミングをサポートするために作成し、SO クラウドと共有したいのはどれですか?

これまでに作成したテンプレート (例):

メソッドから返す配列のコピーを作成するには:

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

オブジェクトのクローンを作成するには:

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

2 に答える 2

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メソッドメソッドは、2つのオブジェクトが等しいかどうかの判断にinstanceofを使用します。

equalsメソッドが対称的であることが重要であるため(つまり、)、これには危険が伴いますa.equals(b) == b.equals(a)
BのサブタイプでありAA's equalsメソッドが引数がであるかどうかをチェックし、instanceof AB's equalsメソッドが引数がであるかどうかをチェックする場合instanceof B、これらのメソッドによって定義された同値関係は対称ではない可能性があります。


これは、実装するクラス専用でComparableあり、次のことが可能です。

  • 常に同じであるequalsの実装。
  • すべての比較ロジックを1か所にのみ配置する(compareTo()関数)。
  • Comparable#compareTo()確認を求めるjavadocへの準拠(x.compareTo(y)==0) == (x.equals(y))(強く推奨されますが、厳密には必須ではありません)。
于 2008-12-17T12:42:12.660 に答える
2

テンプレートではありませんが、のarray.clone()代わりに使用しSystem.arraycopy()ます。何か問題がありますか?

編集:デコレータを実装するときに使用するテンプレート、特に多くのメソッドを持つインターフェイスの場合:

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

ラップされたインスタンスへの呼び出しを委任することにより、現在のメソッドの実装を生成し、コピー/貼り付けエラーを防ぎます。

于 2008-12-17T12:33:49.277 に答える