6

Findbugsは、次のようなゲッターとセッターを作成するたびに、コードにEI_EXPOSE_REPとEI_EXPOSE_REP2のバグを多数報告します。

  public Date getDate() {
    return date;
  }
  public void setDate(final Date date) {
    this.date = date;
  }

レポートの意味を理解しています。悪意のある/誤ったコードによって変更されないように、オブジェクトの内部参照を外部に公開しないでください。修正は次のようになります。

  public Date getDate() {
    return date == null ? null : date.clone();
  }
  public void setDate(Date date) {
    this.date = date == null ? null : date.clone();
  }

私の質問はここにはありません。このレポートが常に日付に関係していることに驚いています。なぜ他のすべての可変オブジェクトではないのですか?このレポートはすべての可変オブジェクトにも当てはまると思いますね。

この「グッドプラクティス」を、可変オブジェクトを扱うすべてのアクセサーに拡張する必要がありますか?

アドバイスをください、ありがとう

4

2 に答える 2

3

私は確かにこのレポートがすべての可変オブジェクトに関連していることを期待しますが、FindBugsは特定の一般的な違反者を認識していると思います。

私は通常、ゲッターを介して内部状態を公開することに注意しています。

public ArrayList<Trade> getTrades() {
   return trades;
}

意味

  1. クライアントはトレードリストの変更にさらされる可能性があります
  2. クライアントは、あなたが誠意を持って渡したリストを変更する場合があります

そのため、2つのアプローチがあります。

  1. そのオブジェクトの不変のバリアント(つまり、変更できないオブジェクト)を渡します。上記のシナリオでは、そのリストの読み取り専用コピーを取得して渡します(元のオブジェクトに影響を与えないため、単純な読み取り/書き込みコピーを取得して渡すことができると主張するかもしれませんが、それは直感に反します)。
  2. オブジェクト(トレードのリスト)を渡さないでください。むしろ、所有するオブジェクトにそのコレクションに対する操作を実行させてください。これはおそらくOOの本質です-情報を求めて自分で行うのではなく、オブジェクトにあなたのために何かをするように指示します

同様の引数は、セッターとコンストラクターの引数に関連しています。

自分自身を保護するために、露出時に多くのオブジェクトをコピーし、潜在的に多くの余分な作業を行うことに気付く可能性があることに注意してください。これは慎重に使用する手法であり、クライアントオブジェクトが誰であるか、およびそれらを制御および/または信頼できるかどうかを理解する価値があります。

于 2012-11-20T12:27:29.623 に答える
1

Dateオブジェクトには、値を操作するためのsetMonthおよびその他のセッターがありますが、他のほとんどの可変変数には、値を変更するためのセッターがありません(たとえば、Integerにはセッターがありません)。

    Case 1 :

    Date date =  obj.getDate();        
    date.setHours(10);

    Case 2 :

    Integer i = obj.getI();
    i = 10;

Finbugは、ケース1のみをセキュリティ上の脅威と見なします。

于 2013-06-04T12:31:39.583 に答える