可変および不変の Java DateTime API

WBOY
リリース: 2024-08-21 22:38:02
オリジナル
457 人が閲覧しました

Mutable & Immutable Java DateTime API

変更可能な DateTime クラス

java.util パッケージでは、多くのクラスが変更可能です。つまり、クラスの内部状態は作成後に変更される可能性があります。複数のスレッドが同じインスタンスを共有している場合、1 つのスレッドで行われた変更が他のスレッドに予期せず影響を与え、バグが発生する可能性があります。これらの問題により、Java 8 で導入された java.time パッケージで不変クラスが作成されました。

import java.util.Date;

public class MutableDateExample {
    public static void main(String[] args) {
        Date sharedDate = new Date(); // Initial date

        Runnable task1 = () -> {
            sharedDate.setYear(2025 - 1900); // Mutate the date (Deprecated method)
            System.out.println("Task 1: " + sharedDate);
        };

        Runnable task2 = () -> {
            sharedDate.setMonth(5); // Mutate the month
            System.out.println("Task 2: " + sharedDate);
        };

        new Thread(task1).start();
        new Thread(task2).start();
    }
}
ログイン後にコピー

変更可能な日付/時刻クラスに関する問題

同時実行の問題: 上記の例では、両方のタスクがsharedDate オブジェクトを同時に変更します。 Date は変更可能でスレッドセーフではないため、これにより予期しない結果が生じる可能性があります。

データの整合性: コードの一部を変更すると、同じ日付オブジェクトが使用されている他の部分に予期せず影響を与え、不正なデータまたはロジック エラーが発生する可能性があります。

可変クラス: java.util.Date、java.util.Calendar、java.util.GregorianCalendar、java.text.SimpleDateFormat、java.util.TimeZone、java.util.Locale

不変の日時

java.time パッケージ (Java 8 で導入)

java.time API は安全で変更できないように設計されています。そのクラスは不変です。つまり、オブジェクトを作成すると、それを変更することはできません。日付または時刻を更新するには、元のオブジェクトを変更するのではなく、更新された値で新しいオブジェクトを作成します。

  • 主要なクラス
    • LocalDate、LocalTime、LocalDateTime: タイムゾーン情報を含まない日付と時刻を表します。
    • ZonedDateTime、OffsetDateTime、OffsetTime: タイムゾーンまたはオフセット情報を使用して日付と時刻を表します。
    • インスタント: 特定の瞬間 (UTC) を表します。
    • 期間、期間: 時間ベースおよび日付ベースの時間を表します。
LocalDate initialDate = LocalDate.of(2024, 8, 21); // Initial date

        // Create a new date by adding 5 days
        LocalDate updatedDate = initialDate.plusDays(5);

        // Print the initial and updated dates
        System.out.println("Initial Date: " + initialDate);
        System.out.println("Updated Date: " + updatedDate);

        // Print the memory addresses of the initial and updated dates
        System.out.println("Initial Date Address: " + System.identityHashCode(initialDate));
        System.out.println("Updated Date Address: " + System.identityHashCode(updatedDate));

// example output
// Initial Date: 2024-08-21
// Updated Date: 2024-08-26
// Initial Date Address: 1555845260
// Updated Date Address: 1590550415
ログイン後にコピー

まとめ:

  • 可変クラス (java.util.Date、java.util.Calendar): 同時実行の問題、意図しない副作用、過去のバグなどの問題が発生しやすくなります。レガシー コードまたは不変性が問題にならない特定のシナリオにのみ適しています。
  • 不変クラス (java.time): スレッドの安全性、予測可能な動作、および全体的に優れた設計を提供します。新しいコードベースや最新の Java アプリケーションを操作する場合には、これらを優先する必要があります。

以上が可変および不変の Java DateTime APIの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!