Класс персонажа имя, пол, и перечень


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

Я вышел с этой реализации:

public class Character {

    private String name;
    private char gender;
    private List<String> inventory = new ArrayList<String>();

    public Character(String name, char gender, List<String> inventory) {
        this.name = name;
        this.gender = gender;
        this.inventory.addAll(inventory); // Is this a good idea?
    }

    public String getName() {
        return name;
    }

    public char getGender() {
        return gender;
    }

    public List<String> getInventory() {
        return inventory;
    }

}

И в главном классе:

public class Main {

    public static void main(String[] args) {

        Character coolKid = new Character("Cool Kid", 'f',
                                          Arrays.asList("just", "testing"));

        System.out.println(coolKid.getInventory());
        // returns [just, testing]

    }
}

Моя главная забота - "динамически", добавляя элементы в ArrayList при создании, а также используя добавим в конструктор, и список в качестве типа аргумента инвентаризации в конструкторе.

Есть ли лучший способ добиться этого?



Комментарии
1 ответ

Это очень простой реализации. Не так много, чтобы улучшить.

Особенно скопировав список с абонент-это хорошая мера безопасности, как это делает уверен, что если абонент позже изменяет его список, это не влияет на инвентарь персонажа. Это всегда хорошая идея, что изменение состояния экземпляра осуществляется с помощью его методов (поэтому он может правильно настроить себя, например, отказаться от некоторых предметов, если запас будет слишком тяжелым).

Несколько идей для размышления:

Подобно конструктору, можно сделать getInventory() способ безопасен в отношении звонящего попытки изменить список, путем инкапсуляции его в обертку:

return Collections.unmodifiableList(inventory);

Затем абонент может читать список, но не изменить его.

Вам захочется реализовать некоторые методы инвентаризации, чтобы добавить, удалить или найти товарно-материальных ценностей.

Там же есть стиль программирования, где бы вы не реализуете добавить, удалить или найти способы для инвентаризации, и getInventory() способ возврата внутреннего списка, что позволяет пользователю изменять этот список. Но это нарушает инкапсуляцию и, как правило, приводит к проблемам качества, так что не сделать это таким образом.

Наверное, упорядочивание предметов в инвентаре не имеет значения, так что вы могли бы использовать набор вместо списка (но тогда вы не можете иметь несколько экземпляров одного и того же элемента).

И вы могли бы изменить параметр конструктора inventory от List для Collection, что позволяет пользователю передавать предметы, как List или Set, что подходит ему лучше.

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

4
ответ дан 25 февраля 2018 в 06:02 Источник Поделиться