3

文字列を解析して Date オブジェクトを返す public static util メソッドがありますが、解析された文字列を Date オブジェクトに変換できない場合は ParseException もスローします。

ここで、別のクラスで、上記の util メソッドを使用して値に初期化された static final Date を使用したいと考えています。しかし、util メソッドが ParseException をスローすると、これは許可されません。

これは私がやりたいことであり、これは許可されていません

public static final MY_DATE = Util.getDateFromString('20000101');

この日付フィールドを「最終」に保つための推奨される方法は何ですか?

4

4 に答える 4

9

静的初期化ブロックを使用できます。

public static final Date MY_DATE;

static {
    try {
       MY_DATE = Util.getDateFromString("20000101");
    } catch (ParseException e) {
       // Whatever you want to do here. You might want to throw
       // an unchecked exception, or you might want to use some fallback value.
       // If you want to use a fallback value, you'd need to use a local
       // variable for the result of parsing, to make sure you only have a
       // single assignment to the final variable.
    }
}

ただし、これには反対することをお勧めします。Date変更可能な型です - public static final 変数を介して公開するのは悪い考えです。

Java 8 の時点で、java.timeパッケージはほぼすべての日付/時刻の作業に使用するのに最も適しています。

public static final LocalDate START_OF_JANUARY_2000 = LocalDate.of(2000, 1, 1);

Java 8 より前では、多くの不変の日付/時刻型を持ち、日付と時刻を操作するための完全に優れたライブラリであるJoda Timeを使用することをお勧めします。あなたが望むように見えます:

public static final LocalDate START_OF_JANUARY_2000 = new LocalDate(2000, 1, 1);

を使用することにした場合でも、私の見解で文字列を解析することはあまり意味がないことに注意してください。java.util.Date年/月/日 (おそらく適切なタイムゾーンを適用する) からを作成する適切な方法がない場合は、Date簡単に作成できます。

于 2011-12-12T07:21:20.623 に答える
2

ああ、神様!私はついに、より優れた、よりエリートで、よりエレガントな答えで、Jon Skeet をしのぐことができました!

きちんとした方法の 1 つは、次のように、インスタンス ブロックで無名クラスを使用することです。

public static final Date MY_DATE = new Date() {{
    try {
        setTime(Util.getDateFromString("20000101").getTime());
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}};

java.util.Date(驚くべきことに)不変ではないため、これは機能します!

Date を不変にして、設計上より受け入れられるようにするには、setter メソッドもオーバーライドします。

public static final Date MY_DATE = new Date() {{
        try {
            super.setTime(Util.getDateFromString("20000101").getTime());
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
    // Formatted for brevity :)
    @Override public void setYear(int year) { throw new UnsupportedOperationException();}
    @Override public void setMonth(int month) {throw new UnsupportedOperationException();}
    @Override public void setDate(int date) {throw new UnsupportedOperationException();}
    @Override public void setHours(int hours) {throw new UnsupportedOperationException();}
    @Override public void setMinutes(int minutes) {throw new UnsupportedOperationException();}
    @Override public void setSeconds(int seconds) {throw new UnsupportedOperationException();}
    @Override public void setTime(long time) {throw new UnsupportedOperationException();}
};
于 2011-12-12T10:32:03.967 に答える
1

別の方法として、宣言された例外を実際に取得しないことが確実な場合は、次のように、チェックされていない例外で ParseException をラップする別のメソッドをローカルまたは Util で作成することです。

public static final Date MY_DATE = getDateFromStringWithoutExploding("20000101");

private static Date getDateFromStringWithoutExploding(String dateString) {
    try {
        return Util.getDateFromStringWithoutExploding(dateString);
    catch(ParseException e) {
        throw new IllegalArgumentException(e);
    }
}

これは合理的であり、実際に何が起こっているかを反映しています。渡す日付文字列に問題がないことはわかっているため、try-catch はおざなりです。

于 2011-12-12T12:08:08.397 に答える