2

次のコードを検討してください。

public static void main(String[] args) {

    String pattern = "MMM dd, yyyy HH:mm:ss a z";

    // joda-time
    DateTime dt = DateTime.now();
    System.out.println(dt.toString(pattern));

    // java.time
    ZonedDateTime ldt = ZonedDateTime.now();
    System.out.println(ldt.toString(pattern)); // doesn't exist
    System.out.println(ldt.format(DateTimeFormatter.ofPattern(pattern)));
}

joda-time クラス ( DateTimeLocalDateなど) にはtoString、必要な形式の文字列を受け入れるメソッドが含まれていました。これは非常に便利な方法でした。しかし、Java-8 の実装ではこのメソッドが省略されています。代わりに、 を呼び出す必要がありますformat(DateTimeFormatter formatter)

確かに、小さな不満。しかし、私の質問は次のとおりです。これが java.time から省略された理由はありますか? アプリケーションを joda-time から java.time に変換することは、このわずかな欠落のために非常に難しくなります。でも、合理的な理由があれば納得です。あなたが私の懸念を和らげるためにここにいるわけではありませんが、念のため聞いてみようと思いました.

編集:投票に近い人にとって、これは意見に基づく質問ではありません。joda-time/java.time の内部構造と、特定の方法で開発する動機をよく知っている人なら誰でも、たとえ実際にそうでなくても、質問に答える資格があります。

4

3 に答える 3

5

興味深い質問です。Joda-Time と java.time (JSR-310) のデザイン センターは異なります。Joda-Time はオープン ソース ライブラリですが、java.time は JDK の拡張機能です。実際的な意味の 1 つは、メソッド数に対するプレッシャーの増加です。これがここでの要因でした。

Joda-Time で問題となっている方法は、次の 4 つのうちの 1 つです。

  • toString()
  • toString(DateTimeFormatter dtf)
  • toString(String pattern)
  • toString(String pattern, Locale loc)

1 つ目は Java の標準メソッドであるため、デフォルトで含まれています。フォーマッターベースの方法は、フォーマッター自体を使用できるので便利です。2 つのパターンベースのメソッドは、フォーマッタを作成するだけなので、さらに便利です。

ただし、パターンベースのメソッドには、ロケールを使用するバリアントとロケールを使用しないバリアントの 2 つのバリアントが必要であることに注意してください。一方、フォーマッタはロケールを内部的に埋め込みます (したがって、メソッドのバリアントは必要ありません)。JSR-310 を検討する際には、追加のロケール メソッドの必要性が重くのしかかっていました。

追加の考慮事項は、キャッシング/パフォーマンスです。Joda-Time には、「yyyy-MM-dd」のようなパターンの再解析を避けるために、フォーマッターへのパターンのキャッシュがあります。このようなキャッシュは JDK ではあまり歓迎されず、キャッシュを持たない方法を見つけることが望まれました。

java.time を使用するフォーマッターに推奨されるアプローチは、それらを静的変数に割り当てることです。新しいフォーマッタは (古いフォーマッタとは異なり) スレッドセーフであるため、うまく機能します。さらに、フォーマッタの定数を定義することは、パターンの解析が 1 回だけ行われることを意味します。定数は、フォーマット/解析の準備が整った内部データ構造を格納します。

private static final DateTimeFormatter FORMATTER =
                DateTimeFormatter.ofPattern("MMM dd, yyyy HH:mm:ss a z");
public static void main(String[] args) {
  ZonedDateTime ldt = ZonedDateTime.now();
  System.out.println(ldt.format(FORMATTER);
}

最後に、JSR-310 のメソッドは元々 と呼ばれてtoString(DateTimeFormatter)いました。Oracle 内の内部レビューでは、メソッドの名前を に変更することが推奨されましたformat(DateTimeFormatter)

于 2014-04-02T10:46:29.653 に答える