首页 > 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学习者快速成长!