Dalam pakej java.util, banyak kelas boleh berubah, bermakna keadaan dalaman mereka boleh berubah selepas penciptaan. Jika berbilang rangkaian berkongsi kejadian yang sama, perubahan yang dibuat dalam satu utas secara tidak dijangka boleh memberi kesan kepada yang lain, yang membawa kepada pepijat. Masalah ini mendorong penciptaan kelas tidak berubah dalam pakej java.time yang diperkenalkan dalam Java 8.
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(); } }
Isu Concurrency: Dalam contoh di atas, kedua-dua tugas mengubah suai objek sharedDate secara serentak. Ini boleh membawa kepada hasil yang tidak dapat diramalkan kerana Tarikh boleh berubah dan tidak selamat untuk benang.
Integriti Data: Pengubahsuaian dalam satu bahagian kod secara tidak dijangka boleh menjejaskan bahagian lain yang objek tarikh yang sama digunakan, yang membawa kepada data atau ralat logik yang salah.
Kelas boleh ubah: java.util.Date, java.util.Calendar, java.util.GregorianCalendar, java.text.SimpleDateFormat, java.util.TimeZone, java.util.Locale
API java.time direka bentuk untuk selamat dan tidak boleh diubah. Kelasnya tidak boleh diubah, bermakna sebaik sahaja anda mencipta objek, ia tidak boleh diubah. Untuk mengemas kini tarikh atau masa, anda membuat objek baharu dengan nilai yang dikemas kini dan bukannya menukar yang asal.
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
Atas ialah kandungan terperinci API DateTime Java Boleh Berubah & Tidak Boleh Berubah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!