2015-08-16 41 views
3

我只是對O.O.P做一些修改。下週即將舉行的考試,我被困在一個問題上。這個問題基本上是一個狗和跳蚤之間雙向關聯的例子。到目前爲止,我有一隻帶跳蚤的狗。我堅持的部分是「修改狗班,以便一個狗對象最多隻能容納5個跳蚤物體(如果有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); 

    } 

} 

控制檯:

弗雷迪狗(5歲)有跳蚤。他們是:[John(1歲),Patrick(3歲),Alan(7歲),Steven(2歲),Charles(5歲),Derek(1歲),Kevin(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

不錯,您提到防禦性複製;它很容易被返回引用類型的getter遺忘。 –

相關問題