2015-08-16 10 views
3

Я просто делаю некоторую ревизию для своего O.O.P. Экзамен появится на следующей неделе, и я застрял на вопросе. Вопрос в основном дает пример двунаправленной связи между Собакой и Блохой. Пока у меня есть Собака с блохами. Часть, на которую я застрял, - «Измените класс собаки, чтобы объект собаки мог вмещать до 5 объектов блох max (напечатайте« У вашей собаки слишком много блох! », Если есть более 5 блох). Вот мой код до сих пор:Как установить ограничение на количество объектов в ArrayList

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); 

    } 

} 

консоли:

Freddy собака (в возрасте 5) есть блохи. Это: [Джон (в возрасте 1), Патрик (3 года), Алан (7 лет), Стивен (2 года), Чарльз (5 лет), Дерек (1 год), Кевин (8 лет)].

+0

Какое определение метода 'hostFlea'? –

ответ

1

Добавить проверить свое состояние здесь:

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.

+0

Спасибо за это, только что он был в неправильном месте, имеет смысл сейчас! Я также добавил «System.exit (0)»; в заявлении IF, чтобы информация не появлялась независимо, но только если есть меньше 5 блох. Еще раз спасибо. – Jaywin

+2

@Jaywin, 'System.exit (0);' очень плохой подход, особенно на экзаменах :). Если вы хотите, чтобы сразу явно выйти из метода, просто вызовите 'return'. –

+1

Альтернативой просто возвращению было бы исключение. Выбор 'IllegalStateException' был бы правильным выбором. – fabian

0

В вашем методе hostFlea: -

Перед добавлением объекта блохи блохи ArrayList в классе собак, просто проверить размер этого ArrayList.

как: -

public void hostFlea(Flea flea){ 
if(fleas.size() > 5) { 
    System.out.println("This dog has too many fleas!"); 
     } 
else{ 
fleas.add(flea); 
    } 
} 
+0

Спасибо за ваш ответ, я просто проверил лимит в неправильном месте. – Jaywin

1

Я думаю, ваши вынуждены использовать 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); 
} 

Может быть, в последний раз достаточно для экзамена, но добытчик будет проблемой в реальной программе обеспечения там никогда больше как 5 элементов.

+2

Возврат [unmodifiable 'List'] (http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableList-java.util.List-) вместо нового' ArrayList' будет лучше (хотя для этого нужно изменить тип возврата). – fabian

+0

Спасибо за подробный ответ. Да, это будет отлично для моего экзамена, но я вижу, как это будет проблематично, если ситуация в реальной жизни. К сожалению, я не уверен, сколько еще Java я буду делать в этом курсе, поэтому я не думаю, что у меня будет гораздо больше времени, чтобы углубиться в более подробные сведения. – Jaywin

+0

Нет проблем, но для большинства экзаменов по Java я принимал и знал, что важно знать разницу между вызовом по ссылке и вызовом по значению и даже неважно, в этом вопросе, возможно, в более позднем;) – mszalbach

1

Публичный метод собака должен добавить блоха 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); 
} 
+0

Приятно, что вы упоминаете защитное копирование; его легко забыть с помощью геттеров, возвращающих ссылочный тип. –