Reputation: 397
So i am doing a first year university assignment question and i am going to be honest about it. I just want to make things clear before some of you come down-voting my question. I don't want complete code, i just want some help with a few things.
The question is divided into two parts. The first part is to write a Nucleotide class whose constructor has two properties. A single character called base that has to be either 'a' or 'c' or 'g' or 't' otherwise it should be 'n' and a boolean called degenerate.
My code for this part is here:
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;
}
}
The next part of the question says to use the Nucleotide object and create a new Bacteria class. An instance of bacteria consists of a genome (a collection of nucleotides), and a species (a String).
You must create a constructor which accepts a String and a collection, and uses those to initialize the species and the collection of nucleotides. My code for this part is here:
class Bacteria {
//private ArrayList<Nucleotide> genome;
private String species;
public Bacteria(String species, ArrayList<Nucleotide> genome) {
genome = new ArrayList<Nucleotide>();
this.species = species;
}
My problem starts with the next step which asks us to write an instance method that performs deep copy and returns an instance of Bacteria.
public Bacteria binaryFission() {
How can i perform deep copy without serialization and reflection. I hardly know anything about those things.
Again i need pointers or the basic idea of how to go about completing the binaryFission()
method. I have gone through several deep copy questions that are on SO but none of them are relevant to my question so i don't believe that i am asking a duplicate question. I am happy to provide more details though.
Upvotes: 0
Views: 98
Reputation: 4089
This is the way to do it manually
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);
}
FYI - you'll need to add getters for your Nucleotide class private variables in order for this to work since they are private and Bacteria won't have access to their values without them.
Upvotes: 1
Reputation: 424983
Since Nucleotide
has no setters, and its fields are primitive, it is effectively immutable (can't be changed and therefore safe to "reuse"). You would be better to make the fields final
to formally make it immutable.
All you need to make a deep copy is to make a shallow copy of your Nucleotide
list and use that in your new Bacteria
. You can make a copy like this:
List<Nucleotide> copy = new ArrayList<>(genome);
You could create a simple factory method on Bacteria
that returns a deep copy of itself:
public Bacteria copy() {
return new Bacteria(species, new ArrayList<>(genome));
}
Upvotes: 1