【问题标题】:Best way to clone java.time.LocalDateTime克隆 java.time.LocalDateTime 的最佳方法
【发布时间】:2019-01-21 09:05:10
【问题描述】:

我想创建一个副本java.time.LocalDateTime,但它没有clone() 方法。

我要做的是:

long epochMilli = Instant.now().toEpochMilli();

LocalDateTime createDate =  LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());

LocalDateTime modificationDate = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());

有没有最简单的方法来创建两个具有完全相同的日期时间值的 LocalDateTime 对象?

【问题讨论】:

  • 为什么要克隆?请记住,由于不可变特性,所有被操纵的实例都是自然的新对象。那么你的观点或意图是什么?

标签: java datetime java-8


【解决方案1】:

因为LocalDateTime 是不可变的,你可以简单地引用同一个对象:

LocalDateTime createDate = LocalDateTime.now();

LocalDateTime modificationDate = createDate;

【讨论】:

  • @Eugene 不可变类被视为值类型,它们的唯一性与它们持有的值有关,而不是它们在内存中的位置,不需要创建 2 个单独的实例。由于无法更改 LocalDateTime 实例,因此您可以有尽可能多的引用使用它。
  • @FilipRistic 我不得不同意,我在这里不好:|
  • @FilipRistic 但这提出了一个有趣的问题......clone 应该为值类型做什么而不是?
  • @Eugene 这确实是一个有趣的问题,clone 按标准应该返回新实例,但并非所有内容都应该是Cloneable。从我的角度来看,值类型不应该是Cloneable,因为没有任何用途可以克隆代表价值的东西,因为它们最终具有相同的值,这又使它们完全相同。例如,没有人会克隆数字 5 来获得另一个 5,值对象是相同的,它们与它们持有的值相关联,而不是与内存地址相关。
【解决方案2】:

由于LocalDateTime 是不可变的,according to its Javadoc 没有真正的理由克隆它。

您可以只使用同一个实例,然后传递它,而不必防御性地克隆它并失去性能。

【讨论】:

    【解决方案3】:

    由于它是不可变的,你可以这样做:

    LocalDateTime copy = createDate.plusHours(0);
    System.out.println(createDate.equals(copy)); // true
    

    plusHours doc:

    返回具有指定数量的 LocalDateTime 的副本 小时增加。此实例是不可变的,不受此方法的影响 打电话。

    【讨论】:

    • 在我的 Java 10 上,这只是返回了相同的对象,而不是副本。
    • @OleV.V.刚看了源码,增量为0时返回相同的对象...
    【解决方案4】:
    LocalDateTime orig = LocalDateTime.now();
    LocalDateTime copy = LocalDateTime.from( orig );
    

    已编辑: 此代码将从 LocalDateTime 源返回相同的对象:

    public static LocalDateTime from(TemporalAccessor temporal) {
           if (temporal instanceof LocalDateTime) {
              return (LocalDateTime) temporal;
           } 
           ...
    

    【讨论】:

    • 在我的 Java 10 上,这只是返回了相同的对象,而不是副本。
    • 是的,其实返回的是同一个对象
    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多