深层复制并返回实例Java

时间:2016-10-28 23:05:23

标签: java class clone deep-copy

所以我正在做第一年的大学任务问题,我会诚实地对待它。我只是想在你们有些人下来之前说清楚 - 投票我的问题。我不想要完整的代码,我只想要一些帮助。

这个问题分为两部分。第一部分是编写一个Nucleotide类,其构造函数有两个属性。一个叫做base的字符必须是' a'或者' c'或者' g'或者' t'否则它应该是' n'和一个名为degenerate的布尔值。

这部分的代码在这里:

where b = goo a
      a = foo

问题的下一部分说使用Nucleotide对象并创建一个新的Bacteria类。细菌的实例由基因组(核苷酸的集合)和物种(String)组成。

您必须创建一个接受String和集合的构造函数,并使用它们 初始化物种和核苷酸的集合。 这部分的代码在这里:

class Nucleotide {
    private char base;
    private boolean degenerate;

    public nucleotide(char base, boolean degenerate){
      if(base != ‘a’ || base != ‘c’ || base != ‘g’ || base != ’t’){
        this.base = ’n’;
      } else {
          this.base = base;
      }
      this.degenerate = degenerate;
    }
}
  

我的问题从下一步开始,它要求我们编写一个执行深层复制并返回Bacteria实例的实例方法。

class Bacteria { //private ArrayList<Nucleotide> genome; private String species; public Bacteria(String species, ArrayList<Nucleotide> genome) { genome = new ArrayList<Nucleotide>(); this.species = species; }

如何在没有序列化和反射的情况下执行深层复制。我对这些事情几乎一无所知。

我再次需要指针或如何完成public Bacteria binaryFission() {方法的基本思路。 我已经阅读了几个关于SO的深层复制问题,但没有一个与我的问题相关,所以我不相信我会问一个重复的问题。我很乐意提供更多细节虽然。

2 个答案:

答案 0 :(得分:1)

由于Nucleotide没有setter,并且其字段是原始的,因此它实际上是不可变的(无法更改,因此可以安全地重用&#34;)。你最好让字段final正式使其成为不可变的。

您需要制作一份深层副本,只需制作Nucleotide列表的浅表副本,然后在新的Bacteria中使用该副本。你可以制作这样的副本:

List<Nucleotide> copy = new ArrayList<>(genome);

您可以在Bacteria上创建一个简单的工厂方法,返回自身的深层副本:

public Bacteria copy() {
   return new Bacteria(species, new ArrayList<>(genome));
}

答案 1 :(得分:1)

这是手动执行此操作的方法

public Bacteria binaryFission() {
    String speciesClone = this.species;
    ArrayList<Nucleotide> genomeClone = new ArrayList<Nucleotide>();
    //now iterate over the existing arraylist and clone each Nucleotide
    for(int index = 0; index < this.genome.size(); index++)
    {
        genomeClone.add(new Nucleotide(
                            genome.get(index).getBase(), //needs to be added to the Nucleotide class to retrieve the base variable
                            genome.get(index).getDegenerate() //needs to be added to be allowed to get its degenerate
                ));
    }

    return new Bacteria(speciesClone, genomeClone);
}

仅供参考 - 你需要为你的Nucleotide类私有变量添加getter,因为它们是私有的,并且Bacteria在没有它们的情况下无法访问它们的值。