开发者社区> 问答> 正文

对于不可变类克隆的问题

public final class BrokenPerson                                
{                                                              
  private String firstName;                                    
  private String lastName;                                     
  private Date dob;                                            

  public BrokenPerson( String firstName,                   public BetterPerson( String firstName, 
    String lastName, Date dob)                                             String lastName, Date dob)          
  {                                                                                      {                                     
   this.firstName = firstName;                                             this.firstName = firstName;         
   this.lastName = lastName;                                             this.lastName = lastName;           
   this.dob = dob;     //error               this.dob = new Date( dob.getTime() ); //correct 
  }                                                                                       }                                      

  public String getFirstName() 
  { 
   return this.firstName; 
  } 
  public String getLastName() 
  { 
   return this.lastName; 
  } 
  public Date getDOB()                                               public Date getDOB()                     
  {                                                                                    {                                      
   return this.dob;    //error                  return new Date( this.dob.getTime() );//correct 
  }                                                                                     }                                      
} 

上面的代码是在别人的博客上看到的,我能够理解在get一个Date类型的时候进行克隆,但是我不能理解在构造方法中的Date类型为什么还需要进行克隆之后才赋值给成员变量,也就是这句:this.dob = new Date( dob.getTime() );

展开
收起
蛮大人123 2016-05-26 15:54:28 1735 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    构造函数丯对Date类型的数据赋值时是用克隆,避免外界修改原参数对象对该对象的影响。可以测试不使用克隆的结果:
    1 把构造函数直接赋值:this.dob = dob;
    2 编写测试类:

     public static void main(String[] args){
          Date  date = new Date();
                BrokenPerson b = new BrokenPerson("hello","world,date);
                System.out.print(b.getDOB());
                //修改date信息,可以看到BrokenPeron的dob属性值也被修改了,因为它与date是同一个引用。
                date.setTime(System.currentMilliseconds());
                System.out.print(b.getDOB());
     }
    2019-07-17 19:16:23
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载