复制构造函数创建垃圾对象

时间:2017-09-17 12:54:00

标签: java oop constructor garbage

我老师给了我两个班,一个是护照,另一个是约会  date包含3个属性(字符串日,字符串月,字符串年),getter,setter和2个构造函数,其中一个是复制构造函数:

 public date(date dt)
 this.day=dt.getd();
 this.month=dt.getm();
 this.yaer=dt.gety();

护照类包含2个属性(字符串名称,日期exp(来自日期类))并且有这样的结构:

public passport(string name, date exp)   
this.name=name;  
this.exp= new date(exp);    

现在在主课堂上,每次创建新日期和新护照时,每个日期都是重复的,每个护照都会得到1个垃圾对象。
我怎么能克服这个垃圾对象?

3 个答案:

答案 0 :(得分:0)

  

我怎样才能克服这个垃圾对象?

如果date个实例是可变的,则不会;你做你正在做的事。

如果date个实例不可变(它们的状态一旦创建就无法更改),那么您只需使用您提供的实例而不是创建新实例:

public passport(string name, date exp)   
    this.name = name;  
    this.exp = exp;
}

如果可以修改exp,则不希望这样做,因为它会在您的passport实例与通过exp的任何内容之间产生串扰。

答案 1 :(得分:0)

  

我怎样才能克服这个垃圾对象?

让垃圾收集器完成它的工作:因为作为参数传递给Date构造函数的Passport变量将超出执行上下文的范围,底层的Date对象将是有资格被收集。

最直接的做法是不将Date对象分配给变量。
只需在Passport构造函数调用中内联其实例化:

Passport passport = new Passport(name, new Date(day, month, year));

答案 2 :(得分:0)

可选解决方案:

主要课程中的

passport[] arr = new passport[100];   // we have 100 passports
date d1= new date ()                  //null date
for (int i=0,i<100,i++)               // we have 100 passports
{ d1.setd();                          //our setter asks for an input
  d1.setm();
  d1.sety();
  arr [i]=new passport (string name, d1); }