質問

最近、私は内部状態の公開に関する 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)、 どこ:

このクラスは、スーパークラスの等しいメソッドをオーバーライドする等しいメソッドを定義します。どちらの等しいメソッドでも、2 つのオブジェクトが等しいかどうかを判断する際に、instanceof を使用します。

等号メソッドが対称であることが重要であるため、これには危険が伴います (つまり、 a.equals(b) == b.equals(a)).
もし B のサブタイプです A, 、 そして Aのequalsメソッドは、引数が instanceof A, 、Bのequalsメソッドは、引数が instanceof B, 、これらの方法によって定義される同値関係は対称ではない可能性が非常に高くなります。


これは実装するクラスのみに適用されます Comparable そして次のことを可能にします。

  • 常に同じであるequalsの実装。
  • すべての比較ロジックは 1 か所のみに配置されます ( compareTo() 関数);
  • javadoc への準拠 Comparable#compareTo() それを確実にするよう求める (x.compareTo(y)==0) == (x.equals(y)) (強く推奨されますが、厳密に必須ではありません)。

他のヒント

未テンプレートが、私が代わりにarray.clone()System.arraycopy()を使用しています。それに何か問題がありますか?

編集: デコレータを実装するとき、私は特に多くのメソッドとのインタフェースのために、使用したテンプレートます:

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

従って、コピー/ペーストのエラーを防止する、ラップされたインスタンスへの呼び出しを委任することによって、現在のメソッドの実装を生成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top