Reputation: 65
I'm just doing some revision for my O.O.P. Exam coming up next week and I'm stuck on a question. The question is basically give an example of bi-directional association between a Dog and a Flea. So far I've got a Dog with Fleas. The part I'm stuck on is, "Modify the dog class so that a dog object can only hold up to 5 flea objects max (print "Your dog has too many fleas!" if there's more than 5 fleas). Here's my code so far:
Dog.java
import java.util.ArrayList;
public class Dog {
private String name;
private int age;
private String address;
ArrayList<Flea> fleas = new ArrayList<Flea>(); {
if(fleas.size() > 5) {
System.out.println("This dog has too many fleas!");
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public void hostFlea(Flea flea) {
fleas.add(flea);
}
public ArrayList<Flea> getDogFlea() {
return fleas;
}
public String toString() {
return name + " the Dog (aged " + age + ") has fleas. \nThey are: " + fleas + ".";
}
}
Flea.java
public class Flea {
private String name;
private int age;
public Flea (String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return name + " (aged " + age + ")";
}
}
Test.java
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("Freddy");
dog.setAddress("Cork");
dog.setAge(5);
Flea flea1 = new Flea("John", 1);
dog.hostFlea(flea1);
Flea flea2 = new Flea("Patrick", 3);
dog.hostFlea(flea2);
Flea flea3 = new Flea("Alan", 7);
dog.hostFlea(flea3);
Flea flea4 = new Flea("Steven", 2);
dog.hostFlea(flea4);
Flea flea5 = new Flea("Charles", 5);
dog.hostFlea(flea5);
Flea flea6 = new Flea("Derek", 1);
dog.hostFlea(flea6);
Flea flea7 = new Flea("Kevin", 8);
dog.hostFlea(flea7);
System.out.println(dog);
}
}
Console:
Freddy the Dog (aged 5) has fleas. They are: [John (aged 1), Patrick (aged 3), Alan (aged 7), Steven (aged 2), Charles (aged 5), Derek (aged 1), Kevin (aged 8)].
Upvotes: 3
Views: 1110
Reputation: 311188
The public method a dog is supposed to add a flea is hostFlea
, so you need to change that:
public void hostFlea(Flea flea) {
// If the dog already has at least 5 fleas, you can't add another
if (fleas.size() >= 5) {
System.out.println("Your dog has too many fleas!");
} else {
fleas.add(flea);
}
}
However, getDogFlea()
returns the internal ArrayList
, so there's nothing stopping a determined user from calling dog.getDogFlea().add(flea6)
. In order to protect against such behavior, you could either copy the data:
public ArrayList<Flea> getDogFlea() {
return new ArrayList<>(fleas);
}
Or, at the "cost" of relaxing the API to return a List
instead of an ArrayList
, the text book solution would be to use Collections.unmodifiableList
:
public List<Flea> getDogFlea() {
return Collections.unmodifiableList(fleas);
}
Upvotes: 1
Reputation: 4197
Add checking your condition here:
public void hostFlea(Flea flea) {
if(fleas.size() >= 5) {
System.out.println("This dog has too many fleas!");
} else {
fleas.add(flea);
}
}
not at definition of your list variable (as you did), because you just added an instance initialization block.
Upvotes: 1
Reputation: 11440
I guess your are forced to use ArrayList. So you have to ensure no one modifies the list other as your dog class. So make the List private
private ArrayList<Flea> fleas = new ArrayList<Flea>();
Return a copy and do not expose the original List in the getDogFlea
method
public ArrayList<Flea> getDogFlea() {
return new ArrayList(fleas); //use copy constructor to not expose original list
}
And add the check in your hostFlea
method.
public void hostFlea(Flea flea) {
if(fleas.size() == 5 ) {
System.out.println("This dog has too many fleas!");
return; //so the 6th element is not added
}
fleas.add(flea);
}
Maybe last is enough for your exam but the getter would a problem in a real program ensuring there are never more as 5 elements.
Upvotes: 1
Reputation: 5649
In your hostFlea method:-
Before adding the Flea object to fleas ArrayList in Dog class, just check the size of this arraylist.
Like:-
public void hostFlea(Flea flea){
if(fleas.size() > 5) {
System.out.println("This dog has too many fleas!");
}
else{
fleas.add(flea);
}
}
Upvotes: 0