2011-10-28 7 views
11

これは、さらに多くの質問に続く1 & 2です。JavaのDateオブジェクトの変更可能性に関するFindbugsの問題

質問に以下のコード

public Date getSomeDate() { 
    return someDate; 
} 

に語ったように、あなたにfindbugエラーissueを与えるでしょう。

提案された解決策は、これは良いアプローチです

public Date getSomeDate() { 
    return new Date(someDate.getTime()); 
} 

のように両方のゲッターとセッターでDateオブジェクトを複製したり、これに任意の代替方法があることでしたか?

この問題を克服できる、Javaで使用可能な不変の日付ライブラリがありますか?

+0

あなたは不変の権利を意味ですか?とにかく、述べられたアプローチは完璧です。 –

+0

@PrinceJohnWesley:ありがとうございます。 Qを更新しました。あなたはgetterとsetterのすべてでDateコンストラクタを使用することをOKと言っていますか? – ManuPK

+0

外部ライブラリへの呼び出しを公開しない限り。あなたが何をするかを知っているので、それを深くクローンする必要はありません(コンストラクタ)。それ以外の場合は、変更可能な場合は常に差分参照を与えます。 joda time api –

答えて

6

JodaTimeには不変の日付があります。

確かに、ゲッターにDateコンストラクタを使用しても問題ありません。

FindBugsは潜在的なエラーとして可変状態をペグしているからといって、それは本質的には–を気にする価値があるわけではありません。クラスの使用方法によって異なります。不変性は、あなたが気にする必要があるかもしれないバグの1つのタイプを排除します。

0

ユースケースに応じて、DateにラップせずにsomeDate.getTime()を返すことができます。

0

変更されたオブジェクトがsetSomeDateて戻ってくると、コピーが変更された値を保持するため、私たちはセキュリティ上のリスクを排除していないgetSomeDatesetSomeDateメソッド内のオブジェクトをコピーして...ちょっと待って。この種のセキュリティ問題を解決するには、setSomeDateを削除する必要があります。または、それについて心配する必要はありません。ゲッターとあなたがnull値についての世話をする必要がセッターの両方を適応させる以外に

+2

オブジェクトのコピーを返すことで、内部表現が共有されるのを避けることができます。ローカル変数にこのプロパティを受け取っても呼び出し元のコードがこれを操作する状況を避けるのに役立ちます。かわった。明白に述べるために、setsomeDateはそれが基本的なBeanの振る舞いであるので削除することはできません。 – emeralddove

7

アテンション・フォークス...

public Date getSomeDate() { 
    if (this.someDate == null) { 
    return null; 
    } 
    return new Date(this.someDate.getTime()); 
} 

public void setSomeDate(final Date someDate) { 
    if (someDate == null) { 
    this.someDate = null; 
    } else{ 
    this.someDate = new Date(someDate.getTime()); 
    } 
} 
関連する問題