【问题标题】:Copy constructor create garbage objects复制构造函数创建垃圾对象
【发布时间】:2017-09-17 12:53:59
【问题描述】:

我的老师给了我两门课,一门是护照,一门是日期。
date 包含 3 个属性(字符串日期、字符串月份、字符串年份)、getter、setter 和 2 个构造函数,其中一个是复制构造函数:

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

passport 类包含 2 个属性(字符串名称、日期 exp(来自日期类))并且有这个构造:

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

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

【问题讨论】:

  • 如果你的老师真的给你date和passport课程,你可能会建议他/她尊重标准的Java命名约定,其中类名最初是大写的和驼峰式的。所以类将是Date 和Passport。 (或者他/她可能想为 Date 使用不同的名称,以避免与 JDK 中已有的两个 Date 类混淆。)使用标准命名约定可以让其他人更容易阅读您的代码。任何 Java 老师都不应该使用全小写的类名,这会让人质疑该老师是否真的知道他们在 Java 中所做的事情。
  • “1 个垃圾对象”到底是什么意思?
  • 可能还值得一提的是,标准命名会在方法名称中使用全部作品,例如,getDay,而不是getd。

标签: java oop constructor garbage


【解决方案1】:

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

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

如果date 实例是不可变的(它们的状态一旦被创建就不能改变),那么你只需使用你给定的实例而不是创建一个新实例:

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

如果exp 可以修改,您不会想这样做,因为它会在您的passport 实例和传递给它的exp 之间产生串扰。

【讨论】:

  • 日期可以是可变的,这就是她给我们复制构造函数的原因。我想在 main 中使用一个 for 循环,每次都会覆盖第一个日期对象。
  • @3xhaust:不知道你在用main 中的for 循环在说什么(因为你还没有向我们展示main),但是如果date 是可变的,您按照自己的方式创建一个新日期。这叫防御副本,这里是正确的做法。
  • 如果类是不可变的,那么复制构造函数就没有意义了。
  • @Michael:不是纯粹的复制构造函数,不,完全如此。我只是很彻底。 (鉴于老师提供的代码的明显质量,我们无法确定任何事情。:-))具有不可变实例的类通常会公开允许您“修改”(通过复制)一个或多个的方法属性返回具有修改后属性的新实例,例如,date withDays(int days) 将返回具有相同月份和年份但给定天数值的 date。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    可选解决方案:

    在主类中:

    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); }
    

    【讨论】:

      猜你喜欢
      • 2020-09-17
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多