Java深度复制String和Date对象之间的区别

时间:2018-02-08 15:28:14

标签: java cloneable java-date

如何为日期对象创建深层副本,例如学生的birthDate?如何复制与姓名或年龄不同的日期对象?

以下是我从网上克隆的一个例子。

import java.util.Date;
public class Clone
{
    public static void main(String[] args)
    {
        Date d1 = new Date(90,10,5);
        Object d2=d1.clone();
        System.out.println("Original Date:" +d1.toString());
        System.out.println("Cloned Date:" +d2.toString());
    }
}

但这是一个深刻的复制?

  

OUTPUT原始日期:Mon Jan 05 00:00:00 IST 2018克隆日期:星期一   1月05日00:00:00 IST 2018年 -

     

添加额外的信息......

     

那么如何将代码放入我的课程中呢?

// insideCloneable class
/overriding clone() method to create a deep copy of an object. 
protected Object clone()throws CloneNotSupportedException{ 
        Employee employee = (Employee) super.clone();
        return employee;  
        }

//implementing  class - main method 
Employee employee1 = new Employee(01,"John","02-11-2017");
        Employee employee2 = null;
employee2=(Employee)employee1.clone();

2 个答案:

答案 0 :(得分:2)

componentWillReceiveProps

java 8+ new API

Original link

答案 1 :(得分:2)

TL;博士

newEmployee.setHiredDate( oldEmployee.getHiredDate() ) ;  // No need to copy/clone an immutable `LocalDate` object.
  • 使用java.time.Instant代替java.util.Date
  • 使用java.time.LocalDate获取仅限日期的值。
  • 不可变,重新使用 java.time 对象而不是复制/克隆。

java.time

Date类属于麻烦的旧日期时间类,而不是现在的类,取而代之的是 java.time 类。

Instant

现代等同于Date的是InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = Instant.now() ;  // Current moment in UTC.

您可以使用添加到旧类的新方法进行转换。

Instant instant = myJavaUtilDate.toInstant() ;

LocalDate

但是你似乎对没有时间和没有时区的仅限日期的值感兴趣。如果是,请使用LocalDate

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" ) ;
LocalDate ld = LocalDate.parse( "02-11-2017" , f ) ;

可以重复使用不可变对象而不是克隆/复制

java.time类使用immutable objects因此无需复制或克隆。只需指定相同的对象即可。

新克隆的Employee对象获取对原始LocalDate对象所拥有的同一Employee对象的引用。

字符串

顺便说一句,您可以通过调用toString java.time 对象序列化为标准ISO 8601格式化字符串。

String x = ld.toString() ;                        // Serialize object’s value as text in standard ISO 8601 format.

通过致电parse实例化。

LocalDate ld = LocalDate.parse( "2017-02-11" ) ;  // Parse text to instantiate object.

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore