我只是在为下周的O.O.P.考试做些复习,我被一个问题困住了。这个问题基本上是给出狗和跳蚤之间双向关联的一个例子。到目前为止,我养了一只跳蚤狗。我坚持的部分是,“修改狗类,以便狗对象最多只能容纳5个跳蚤对象(打印”您的狗有太多跳蚤!“如果有超过5只跳蚤)。
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);
}
}控制台:
狗弗雷迪(5岁)有跳蚤。他们是:约翰(1岁)、帕特里克(3岁)、艾伦(7岁)、史蒂文(2岁)、查尔斯(5岁)、德里克(1岁)、凯文(8岁)。
发布于 2015-08-16 20:15:29
在这里添加检查您的条件:
public void hostFlea(Flea flea) {
if(fleas.size() >= 5) {
System.out.println("This dog has too many fleas!");
} else {
fleas.add(flea);
}
}而不是在列表变量的定义上(就像您所做的那样),因为您刚刚添加了an instance initialization block。
发布于 2015-08-16 20:18:29
我想你是被迫使用ArrayList的。因此,你必须确保没有人修改的名单,其他作为你的狗类。所以把清单写成私密
private ArrayList<Flea> fleas = new ArrayList<Flea>();返回副本,而不公开getDogFlea方法中的原始列表
public ArrayList<Flea> getDogFlea() {
return new ArrayList(fleas); //use copy constructor to not expose original list
}并在hostFlea方法中添加检查。
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);
}也许最后一次考试就足够了,但是在一个真正的程序中,getter会成为一个问题,确保永远不会有超过5个元素。
发布于 2015-08-16 20:25:06
狗应该添加跳蚤的公共方法是hostFlea,所以您需要修改它:
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);
}
}但是,getDogFlea()返回内部ArrayList,因此没有什么可以阻止确定的用户调用dog.getDogFlea().add(flea6)。为了防止这种行为,您可以复制数据:
public ArrayList<Flea> getDogFlea() {
return new ArrayList<>(fleas);
}或者,以放松API以返回List而不是ArrayList的“代价”,教科书解决方案将是使用Collections.unmodifiableList。
public List<Flea> getDogFlea() {
return Collections.unmodifiableList(fleas);
}https://stackoverflow.com/questions/32039458
复制相似问题