如何限制 ArrayList 中的对象数量
How to put a limit on the amount of objects in an ArrayList
我正在为我的 O.O.P 做一些修改。下周就要考试了,我被一个问题困住了。这个问题基本上是举一个狗和跳蚤之间双向关联的例子。到目前为止,我有一只带跳蚤的狗。我坚持的部分是,"Modify the dog class so that a dog object can only hold up to 5 flea objects max (print "你的狗有太多跳蚤!”如果跳蚤超过 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 岁)有跳蚤。
他们是:[John(1 岁)、Patrick(3 岁)、Alan(7 岁)、Steven(2 岁)、Charles(5 岁)、Derek(1 岁)、Kevin(8 岁)]。
在此处添加检查您的状况:
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.
在你的 hostFlea 方法中:-
在将 Flea 对象添加到 Dog 中的跳蚤 ArrayList 之前 class,只需检查此 arraylist 的大小。
喜欢:-
public void hostFlea(Flea flea){
if(fleas.size() > 5) {
System.out.println("This dog has too many fleas!");
}
else{
fleas.add(flea);
}
}
我猜你被迫使用 ArrayList。所以你必须确保没有人像你的狗一样修改列表class。所以将列表设为私有
private ArrayList<Flea> fleas = new ArrayList<Flea>();
Return 一个副本,不要在 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);
}
也许 last 对您的考试来说已经足够了,但是 getter 在实际程序中会出现问题,确保永远不会超过 5 个元素。
狗的public方法应该添加跳蚤是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()
return 是内部 ArrayList
,因此没有什么能阻止坚定的用户调用 dog.getDogFlea().add(flea6)
。为了防止这种行为,您可以复制数据:
public ArrayList<Flea> getDogFlea() {
return new ArrayList<>(fleas);
}
或者,在 "cost" 放宽 API 到 return 一个 List
而不是 ArrayList
,教科书的解决方案是使用 Collections.unmodifiableList
:
public List<Flea> getDogFlea() {
return Collections.unmodifiableList(fleas);
}
我正在为我的 O.O.P 做一些修改。下周就要考试了,我被一个问题困住了。这个问题基本上是举一个狗和跳蚤之间双向关联的例子。到目前为止,我有一只带跳蚤的狗。我坚持的部分是,"Modify the dog class so that a dog object can only hold up to 5 flea objects max (print "你的狗有太多跳蚤!”如果跳蚤超过 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 岁)有跳蚤。 他们是:[John(1 岁)、Patrick(3 岁)、Alan(7 岁)、Steven(2 岁)、Charles(5 岁)、Derek(1 岁)、Kevin(8 岁)]。
在此处添加检查您的状况:
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.
在你的 hostFlea 方法中:-
在将 Flea 对象添加到 Dog 中的跳蚤 ArrayList 之前 class,只需检查此 arraylist 的大小。
喜欢:-
public void hostFlea(Flea flea){
if(fleas.size() > 5) {
System.out.println("This dog has too many fleas!");
}
else{
fleas.add(flea);
}
}
我猜你被迫使用 ArrayList。所以你必须确保没有人像你的狗一样修改列表class。所以将列表设为私有
private ArrayList<Flea> fleas = new ArrayList<Flea>();
Return 一个副本,不要在 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);
}
也许 last 对您的考试来说已经足够了,但是 getter 在实际程序中会出现问题,确保永远不会超过 5 个元素。
狗的public方法应该添加跳蚤是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()
return 是内部 ArrayList
,因此没有什么能阻止坚定的用户调用 dog.getDogFlea().add(flea6)
。为了防止这种行为,您可以复制数据:
public ArrayList<Flea> getDogFlea() {
return new ArrayList<>(fleas);
}
或者,在 "cost" 放宽 API 到 return 一个 List
而不是 ArrayList
,教科书的解决方案是使用 Collections.unmodifiableList
:
public List<Flea> getDogFlea() {
return Collections.unmodifiableList(fleas);
}