首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何限制ArrayList中的对象数量

如何限制ArrayList中的对象数量
EN

Stack Overflow用户
提问于 2015-08-16 20:11:33
回答 4查看 748关注 0票数 3

我只是在为下周的O.O.P.考试做些复习,我被一个问题困住了。这个问题基本上是给出狗和跳蚤之间双向关联的一个例子。到目前为止,我养了一只跳蚤狗。我坚持的部分是,“修改狗类,以便狗对象最多只能容纳5个跳蚤对象(打印”您的狗有太多跳蚤!“如果有超过5只跳蚤)。

Dog.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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岁)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-16 20:15:29

在这里添加检查您的条件:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2015-08-16 20:18:29

我想你是被迫使用ArrayList的。因此,你必须确保没有人修改的名单,其他作为你的狗类。所以把清单写成私密

代码语言:javascript
复制
private ArrayList<Flea> fleas = new ArrayList<Flea>();

返回副本,而不公开getDogFlea方法中的原始列表

代码语言:javascript
复制
public ArrayList<Flea> getDogFlea() {
     return new ArrayList(fleas); //use copy constructor to not expose original list
}

并在hostFlea方法中添加检查。

代码语言:javascript
复制
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个元素。

票数 1
EN

Stack Overflow用户

发布于 2015-08-16 20:25:06

狗应该添加跳蚤的公共方法是hostFlea,所以您需要修改它:

代码语言:javascript
复制
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)。为了防止这种行为,您可以复制数据:

代码语言:javascript
复制
public ArrayList<Flea> getDogFlea() {
     return new ArrayList<>(fleas);
}

或者,以放松API以返回List而不是ArrayList的“代价”,教科书解决方案将是使用Collections.unmodifiableList

代码语言:javascript
复制
public List<Flea> getDogFlea() {
     return Collections.unmodifiableList(fleas);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32039458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档