3

Netbeans は、 IDEA Code Inspections Listに記載されているこのコードについて不平を言っています。

 public Date getStartDate()
 {
    return theStartDate;
 }

IDEA サイトには次のように記載されています。

このインスペクションは、メソッドから java.lang.Date または java.lang.Calendar フィールドを返そうとする試みを報告します。Date または Calendar は不変の値として扱われることがよくありますが、実際には変更可能であるため、この構成によりオブジェクトの状態が予期せず変更される可能性があります。パフォーマンス上の理由から便利な場合もありますが、この構造は本質的にバグが発生しやすいものです。

他にどのように を返しDateますか?

4

5 に答える 5

9

意図しない変更を避けるために、現在のオブジェクトではなく、問題の値のコピーを返す可能性があります。

最も単純なのはおそらく
return new Date(theStartDate.getTime());

これは、java.util.Dateが可変オブジェクトであり、呼び出し元が誤ってまたは悪意を持って次のようなことを行うことによる問題を回避したいためです。

yourObject.getStartDate().setTime(0);

上記の変更を行うと、上記のようなステートメントは無害になります。

クローンの方法ではなく、コピーのコンストラクターを使用するのはなぜですか?ここを参照してください: java.util.Dateクローンまたはコピーして、内部参照を公開しない

これには、メソッドを呼び出すたびに新しいオブジェクトを作成するというパフォーマンスの低下があることに注意してください。注意して使用してください。

于 2013-02-25T22:21:38.923 に答える
2

return new Date(theStartDate.getTime());

于 2013-02-25T22:22:26.630 に答える
2

IDEAは、Dateオブジェクトは不変オブジェクトとして使用されることが多いと言っています。合理的な解決策は、コンストラクターにtheStartDate.getTime()を含む新しいDateオブジェクトを返すことです。これにより、元のDateオブジェクトの不変性が維持されます:)

于 2013-02-25T22:22:44.227 に答える
1

日付を不変のlong(Date.getTime())として返すことができます。これにより、発信者が日付を変更しないことが保証されます。

もう1つのオプションは、日付をlongとして取得し、新しい日付を返すことですreturn new Date(dateAsLong)。これにより、Dateオブジェクトを返しながら、元の日付が保護されます。

于 2013-02-25T22:21:59.393 に答える
1

おそらく、次を表すlongミリ秒の値を返すことができます。Date

public long getStartDateMilliseconds()
{
    return theStartDate.getTime();
}

long値を返すことで、情報を返すことができDate、呼び出し元が返されたを変更することを防ぐことができますDateDate次に、呼び出し元は:を再構築できます。

Date theDate = new Date(myObject.getStartDateMilliseconds());

IntelliJ検査に合格するはずです。

于 2013-02-25T22:22:47.743 に答える