2016-04-28 1 views
1

とJavaで不変に変更可能な変数を変換します私のコード内でconcurrencyまたはmultithreadingを使用しないでください。いつか私が代わりに私は不変VARSを作成することができますどのように多くの方法を知っている<code>immutable</code>変数の<code>mutable</code>変数を使用するために選択の余地はないが、私はこの方法でも、その本当に<code>immutable</code>に<code>mutable</code>を変換し、私を修正するだろう痛みが少なく

public class Config implements FindIt { 
.... 
    private final class DateHolder{ 

    private final Date dateContainDateObject; 

    DateHolder(String date) throws ParseException { 
     DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); 
     dateContainDateObject = dateFormat.parse(date); 
    } 

    public Date getDate(){ 
     return dateContainDateObject; 
    } 

    } 
} 

これは、ネストされたクラスであり、私は

private DateHolder holder; 

のようにそれを使用してConfigコンストラクタクラスでholder変数を埋めるようにholder変数はThreadSafeですか?

答えて

2

日付は可変オブジェクトです。最終的には、参照を変更することはできませんが、参照の内容を変更することはできます(java.util.Date/Calendarの不快感が再発する可能性がある場合は、Java 8/Joda Timeに切り替えてください)。

Dateメンバへの参照を外部に公開しないでください。代わりに防御的なコピーを作成し、代わりにそれを返す。最終的な長いインスタンスメンバーとして時間値を保存し、必要なときにのみ日付をインスタンス化することを検討することもできます。

+2

か - 本当に、正直に、より良いオプションは、 - 'java.util.Date'を使用しないでください。 –

+2

...すべてが不変でスレッドセーフな 'java.time'パッケージで、新しく改良されたAPIを使用してください。 –

+0

@DimitarDimitrovはタンクしますが、私は最後のJDKをターゲットにしたくありません。サポートがより好きです。JDkバージョン – Hosseini

関連する問題

 関連する問題