首頁 > Java > java教程 > 主體

可變與不可變 Java DateTime API

WBOY
發布: 2024-08-21 22:38:02
原創
457 人瀏覽過

Mutable & Immutable Java DateTime API

可變日期時間類

在 java.util 套件中,許多類別是可變的,這意味著它們的內部狀態在創建後可以改變。如果多個線程共享同一個實例,則一個線程中所做的更改可能會意外影響其他線程,從而導致錯誤。這些問題推動了 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物件。這可能會導致不可預測的結果,因為日期是可變的並且不是線程安全的。

資料完整性:程式碼某一部分的修改可能會意外影響使用相同日期物件的其他部分,導致資料不正確或邏輯錯誤。

可變類別: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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!