【问题标题】:Making a deep copy using a constructor in Java在 Java 中使用构造函数进行深度复制
【发布时间】:2013-04-12 02:50:11
【问题描述】:

我将这些说明用于该方法: 一个构造函数 public ProgrammingTeam(ProgrammingTeam p),它需要一个 ProgrammingTeam p 作为参数并构造 p 的深层副本。不要只写遇见= p.满足;。要进行深拷贝,必须调用 ArrayList 的拷贝构造函数: meet = new 数组列表();。

  public ProgrammingTeam( ProgrammingTeam p ) {
    teamName = p.teamName;
    teamMembers = new String [ p.teamMembers.length ];
    for (int i = p.teamMembers.length - 1; i >= 0; i--) {

    }
    meets = new ArrayList < Competition >();
}

我无法弄清楚我应该如何撰写然后完成深层复制。我知道它需要一个 for 循环来实际复制每个对象,但我不知所措,谢谢!

【问题讨论】:

    标签: java arraylist deep-copy


    【解决方案1】:

    关于字符串数组...

    字符串是不可变的,因此只需复制数组就足够了,例如使用Arrays.copyOf() 实用方法:

    teamMembers = Arrays.copyOf( p.teamMembers, p.teamMembers.length );
    

    至于列表,看情况……

    如果Competitionimmutable,使用ArrayList的拷贝构造函数:

    meets = new ArrayList<Competition>(p.meets);
    

    如果Competition 是可变的,您需要调用它的复制构造函数(如果需要,定义它)。

    meets = new ArrayList<Competition>();
    for (Competition c : p.meets) {
        meets.add(new Competition(c));
    }
    

    【讨论】:

    • 我尝试了 teamMembers 的建议,但它不允许。可能是因为实际变量是 private String[] teamMembers;?
    • “不允许”是什么意思?错误信息是什么?
    【解决方案2】:

    要制作String[] teamMembers 的深层副本,请使用java.util.Arrays.copyOf(teamMembers, teamMembers.length)

    至于List&lt;Competition&gt; meets 的深层副本,您可以使用new ArrayList&lt;Competition&gt;(meets) 进行操作,但只有在竞争不可变的情况下才会这样做

    【讨论】:

      【解决方案3】:

      您需要创建所有 ProgrammingTeam 参数 p 属性的深层副本。

      您可以执行以下操作:

      for(int i = 0; i < p.teamMembers.length -1; i++){
              TeamMember teamMember = new TeamMember();
              // set attributes
              teamMember.setAttribute1(p.teamMembers[i].getAttribute1());
              ...
              teamMember.setAttributeN(p.teamMembers[i].getAttributeN());
               this.teamMembers[i] = teamMember;
       }
      

      当然,您可以简单地为列表中需要深度复制的任何对象创建一个复制构造函数。复制构造函数本质上需要完成我在 for 循环中描述的相同类型的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-08
        • 2010-12-02
        • 1970-01-01
        • 2011-05-11
        • 2018-02-06
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        相关资源
        最近更新 更多