2013-12-12 4 views
0

Я пытаюсь создать систему отслеживания запасов. У меня есть класс (на Java) под названием «InventoryItem» со свойствами имени и количества.Создайте объект, который содержит объекты?

Это прекрасно работает для простых объектов, но что, если мой инвентарь содержит другие элементы инвентаря, например, сервер с ОЗУ?

Должен ли я создавать свой собственный тип данных, или есть лучший способ сделать это (возможно, связанный)? должен ли мой класс расширять любой тип данных или не должен ли я создавать собственный класс?

Мой класс до сих пор:

public class InventoryItem { 
    private String name; 
    private int quantity; 
    private InventoryItem childInventoryItem; 

    // CONSTRUCTORS 
    public InventoryItem() { 
    } 

    public InventoryItem(int quantity, String name) { 
     this.quantity = quantity; 
     this.name = name; 
    } 

    //GETTERS 
    public String getName() { 
     return name; 
    } 

    public int getQuantity() { 
     return quantity; 
    } 

    //SETTERS 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setQuantity(int quantity) { 
     this.quantity = quantity; 
    } 
} 
+0

Я не понимаю эту проблему. Просто используйте «Список» для всех детей. – Blub

+0

Что именно вы имеете в виду, это может иметь другие предметы инвентаризации. Конечно, возможно. Вы можете просто поместить все элементы InventoryItem в LinkedList , чтобы использовать их в другом месте вашего кода. А затем вы просто задали имя «Сервер с ОЗУ» для одного из InventoryItems. –

ответ

1

Дерево обычно является тем, что связано с любыми отношениями между родителями и детьми. Если вы не делаете ничего сложного, вы можете просто сохранить внутренний список, который в основном равен List<InventoryItem>, который содержит любые дочерние элементы.

Так что все вы должны добавить в класс что-то вроде этого:

public class InventoryItem { 

    ... 
    private List<InventoryItem> composingItems = new ArrayList<>(); //if still using Java 6 this must be new ArrayList<InventoryItem>(); 

    ... 

    public void addComposingItem(InventoryItem composingItem) { 
     composingItems.add(composingItems); 
    } 

    public List<InventoryItem> getComposingItems() { 
     //Enforce immutability so no one can mess with the collection. However 
     //this doesn't guarantee immutability for the objects inside the list; 
     //you will have to enforce that yourself. 
     return Collections.umodifiableList(composingItems); 
    } 
} 
+0

Хорошо, я видел это раньше. Было бы лучше иметь список как часть моего класса, или мой класс должен расширять список? или это до моей реализации? – Jeff

+0

@Jeff Это должно быть частью вашего класса. Вы не должны расширять 'List '! Всегда много думайте о необходимости наследования; предпочитают композицию над ней. –

0

Есть много способов, вы можете сделать это. Я думаю, что самый простой способ - создать список массивов.

ArrayList<InventoryItem> childInventory = new ArrayList<InventoryItem>(); 

Затем создайте установщик, который добавляет предметы инвентаря в массив

public void addChildItem(InventoryItem child) 
    childInventory.add(child); 

Таким образом, вы бы иметь список всех дочерних элементов внутри элемента. Вы также можете создать метод для возврата списка всех дочерних элементов в массиве или в ArrayList.

public ArrayList<InventoryItem> getChildItems() 
    return childInventory; 
Смежные вопросы