Передать в метод arrayList

359
08 августа 2017, 14:40

есть три arrayList:

private ArrayList<Clothes> clothes = new ArrayList<>();
private ArrayList<Computer> computers = new ArrayList<>();
private ArrayList<Smartphone> smartphones = new ArrayList<>();

есть switch который в зависимости от выбранного передает в метод arraList:

switch (checkInt()) {
        case 1:
            searchName(clothes);
            break;
        case 2:
            searchName(computers);
            break;
        case 3:
            searchName(smartphones);
            break;}

собственно вопрос: как метод searchName должен принимать arrayList

searchName(???????????????){
}
Answer 1

Максим,

сразу бросилось в глаза, что у вас тип переменно класс, а не интерфейс. Best практика советует использовать как раз-таки интерфейс, например:

private List<Clothes> clothes = new ArrayList<>();
private List<Computer> computers = new ArrayList<>();
private List<Smartphone> smartphones = new ArrayList<>();

Касательно Вашего вопроса, можно использовать generic методологию:

public <T> void searchName(List<T> list)

В вопросе неизвестно являются ли классы Clothes, Computer и Smartphone наследниками какого-то другого класса или интерфейса. Если бы они таки являлись, например:

interface Goods {
    int price();
    int name();
    int amount();
}
class Clothes implements Goods {
...
}
class Computer implements Goods {
...
}

То в таком виде код бы стал более лаконичным: Инициализация:

private static List<Goods> clothes = new ArrayList<>();
private static List<Goods> computers = new ArrayList<>();

Наполнение:

clothes.add(new Clothes());
computers.add(new Computers());

Метод остался бы унифицированным:

public void searchName(List<Goods> list) {
     for (Goods entity : list) {
         System.out.println(entity.price());
     }
}

А вызов метода одинаковый для каждой из коллекций:

searchName(clothes);
searchName(computers);

В худшем случае в варианте с generics можно будет определять какой именно объект пришел, используя instanceof оператор.

Answer 2

Передать вот так:

searchName(ArrayList<Object> objects){
}

Но Вам же нужно организовать поиск в этих массивах?! Тогда вам нужно определить один интерфейс для всех этих классов. Назовем его, например Searchable. В нем опишем функцию getName(). тогда можно будет передавать в функцию параметры так:

Searchable searchName(ArrayList<Searchable> searchableList){
   for (Searchable element in searchableList){
       if(element.getName() == "My some name")
           return element;
   }
}
READ ALSO
Может ли hibernate помочь в добавлении/обновлении строки по ключу/ключам

Может ли hibernate помочь в добавлении/обновлении строки по ключу/ключам

Добрый день Есть сущность Example с полями: id, name, type, values

250
Сравнить две даты без учета времени

Сравнить две даты без учета времени

У меня есть дата в timestamp форматеКаким образом можно проверить равна ли она текущей дате без учета времени? Например 1502010000 она равна 6

401
Разбиение Stream&lt;String&gt;

Разбиение Stream<String>

Есть Stream<String>, как разбить его на несколько Stream или List, относительно тех строк, которые начинаются с определенного слова (аналогично split("word")...

357
Что означает включение и выключение autocommit в Hibernate?

Что означает включение и выключение autocommit в Hibernate?

В чем разница в поведении в случаях если я устанавливаю hibernateconnection

282