在 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 API 被設計為安全且不可更改。它的類別是不可變的,這意味著一旦創建了對象,就無法更改它。若要更新日期或時間,您可以使用更新後的值建立新對象,而不是變更原始物件。
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 DateTime API的詳細內容。更多資訊請關注PHP中文網其他相關文章!