ArrayList в параметрах объекта

Меня интересует как в параметрах объекта использовать ArrayList. Например есть описание объекта Shelf

class Shelf {
    private int id;
    private static int staticId = 10101;
    private String description;
    private ArrayList<Item> items;

    public Shelf(String description, ArrayList<Item> items) {
        this.id = staticId;
        staticId++;
        this.description = description;
        this.items = items;
    }
    public void setItems(ArrayList<Item> items) {
        this.items = items;
    }
}

Есть несколько предметов

Item i = new Item("Shelf", 1, 12, "Shelf", v);
Item ii = new Item("Frozen", 3, 150, "120*250cm", v);
Item cup = new Item("Coffee cup", 1, 5, "A cup for coffee" ,v);

Нужно в параметр items положить что нибудь, например cup.

Shelf emptyShelf = new Shelf("Shelf for cups", cup);

Это так не работает. Как добавить cup в emptyShelf?

Наверное я не правильно формулирую свой вопрос, и по этому не могу найти ответ в гугле. Буду очень благодарен, если кто то поймёт и поможет :)


Ответы (2 шт):

Автор решения: AVRamones

Ну если я правильно понял, то можно вот так сделать:

Измените ваш конструктор класса Shelf:

private int id;
private static int staticId = 10101;
private String description;
private ArrayList<Item> items = new ArrayList<>();

public Shelf(String description, Item...items) {
    this.id = staticId;
    staticId++;
    this.description = description;
    this.items.addAll((Arrays.asList(items));
}

Ну а потом при создании нового объекта Shelf можете положить в параметры items, нужное количество items через запятую:

    Item table = new Item("Shelf", 1, 12, "Shelf", v);
    Item bottle = new Item("Frozen", 3, 150, "120*250cm", v);
    Item cup = new Item("Coffee cup", 1, 5, "A cup for coffee" ,v);

    Shelf emptyShelf = new Shelf("Shelf for cups", cup);
    Shelf emptyShelf = new Shelf("Shelf for cups", table, bottle);
→ Ссылка
Автор решения: Roman Konoval

Вы ищете способ создать массив из элементов.

Есть несколько вариантов, которые могут сработать в зависимости от ваших потребностей.

Arrays.asList

Arrays.asList(cup) создаст массив и его можно сразу передать, как параметр:

Shelf emptyShelf = new Shelf("Shelf for cups", Arrays.asList(cup));

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

emptyShelf.getItems().add(ii); // бросит UnsupportedOperationException

Но при этом можно менять отдельные элементы в массиве:

emptyShelf.getItems().set(0, ii); // заменит первый элемент

Есть вариант это обойти в конструкторе:

Shelf(..., List<Items> items) {
   this.items = new ArrayList<>;
   this.items.addAll(items);
}

Collections.singltonList

Похоже немного на Arrays.asList с одним элементом, но возвращает полностью неизменяемый массив. Даже set не будет работать.

Вручную создать ArrayList

ArrayList<Item> items = new ArrayList<>();
items.add(cup);
Shelf emptyShelf = new Shelf("Shelf for cups", items);

Lists.newArrayList из библиотеки guava

Самый удобный способ если требуется изменяемый объект, но требует внешнюю библиотеку:

Shelf emptyShelf = new Shelf("Shelf for cups", Lists.newArrayList(cup));
→ Ссылка