Способы заполнения списка на Java - PullRequest
1 голос
/ 24 октября 2009

Мне бы хотелось узнать ваше мнение, по которому вы находите лучший способ заполнить список другим методом. Я знаю, что нет определенного ответа, но я хотел бы видеть разумные плюсы и минусы.

Подход 1.

private List<Snap> snapList;
snapList = getSnapList();

Подход 2.

private List<Snap> snapList = new ArrayList<Snap>();
fillSnapList(snapList);

Спасибо, Матиас

Ответы [ 6 ]

6 голосов
/ 24 октября 2009

Почему бы не следовать классу Collections Java API и сделать ваши методы заполнения статичными (если это имеет смысл и не зависит от состояния объекта).

Collections.fill( mylist, 0 );

как

MyListFiller.fill( myList, args );

В любом случае, создание интерфейса наполнителя имеет смысл, если метод заливки планирует измениться. Если вы на самом деле не «заполняете», а возвращаете какое-либо состояние объекта, просто попросите данный метод построить List и вернуть его.

public List<Object> getMyStuff()
{
//build and return my stuff
}
4 голосов
/ 24 октября 2009

Зависит от ситуации.

Метод, подобный getSnapList(), подходит в ситуациях, подобных следующим:

  1. Метод, который вы пишете, не хочет заботиться о том, откуда появился список.
  2. Метод не должен знать, какой список он получает - например, если вы хотите перейти на использование LinkedList, тогда вы можете сделать это в getSnapList() вместо всех методов, которые вызывают fillSnapList() .
  3. Вам захочется заполнить только новые списки.

Метод, подобный fillSnapList(), подходит в ситуациях, подобных следующим:

  1. Возможно, вы захотите заполнить список более одного раза.
  2. Возможно, вы захотите изменить способ заполнения списка (т. Е. Что в него помещено).
  3. Вам нужно заполнить список, который вам кто-то вручил.
  4. Вам нужно поделиться списком между несколькими классами или объектами, и вам может понадобиться пополнить его в какой-то момент его срока службы.
3 голосов
/ 24 октября 2009

Мне нравится подход 1 лучше, чем подход 2, потому что список действительно является результатом метода, который вы вызываете. Подход 1 делает это более ясным, чем подход 2.

Кроме того, подход 1 дает методу возможность вернуть неизменяемый список. Вы можете захотеть этого, если список должен быть заполнен один раз и не должен изменяться позже.

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

1 голос
/ 24 октября 2009

Одним из доводов в пользу первого варианта является то, что выбранное вами имя метода (getSnapList()) часто считается простым средством доступа, т.е. возвращает ссылку на поле snapList. В вашем дизайне подразумевается, что вы будете создавать список, если он не существует, и заполнять его данными, что будет создавать побочный эффект для обычной идиомы.

В связи с этим и, как лучше сказать, я предпочитаю второй вариант.

0 голосов
/ 24 октября 2009

Я предпочитаю подход № 1, потому что метод может быть переопределен подклассом, который захочет использовать другую реализацию List. Кроме того, я думаю, что присвоение фабричного метода методу получателя сбивает с толку, я бы лучше назвал его newSnapList () или createSnapList ().

0 голосов
/ 24 октября 2009

Это полностью зависит от вашего контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...