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 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 中国語 Web サイトの他の関連記事を参照してください。