Лучшие практики Java, добавить в коллекцию до или после изменения объекта? - PullRequest
2 голосов
/ 27 июля 2010

Скажем, вы добавляете x количество объектов в коллекцию, и после или до добавления их в коллекцию вы изменяете атрибуты объектов. Когда вы добавите элемент в коллекцию до или после изменения объекта.

Вариант А)

public static void addToCollection(List<MyObject> objects) {
    MyObject newObject = new MyObject();
    objects.add(newObject);
    newObject.setMyAttr("ok");
}

Вариант Б)

public static void addToCollection(List<MyObject> objects) {
    MyObject newObject = new MyObject();
    newObject.setMyAttr("ok");
    objects.add(newObject);
}

Ответы [ 7 ]

12 голосов
/ 27 июля 2010

Чтобы быть в безопасности, вы должны изменить перед добавлением, если только нет особой причины, по которой вы не можете сделать это, и вы знаете, что коллекция может обработать изменение.Можно разумно предположить, что пример безопасен, поскольку общий List контракт не зависит от атрибутов объекта - но это ничего не говорит о конкретных реализациях, которые могут иметь дополнительное поведение, зависящее от значения объекта.TreeSet и Maps в целом не допускают изменения объектов после их вставки, поскольку структура коллекции зависит от атрибутов объекта.Для деревьев любые атрибуты, используемые компаратором, не могут быть изменены после добавления элемента.Для карт это hashCode, который должен оставаться постоянным.

Так что, в общем, сначала измените, а затем добавьте.Это становится еще более важным в случае одновременных коллекций, поскольку добавление first может привести к тому, что другие пользователи коллекции увидят объект до того, как ему будет присвоено его окончательное состояние.

4 голосов
/ 27 июля 2010

В приведенном вами примере не возникнет никаких проблем, поскольку вы используете коллекцию List, которая не заботится о содержимом объекта.

Если вы использовали что-то вроде TreeMap, который внутренне сортирует содержимоеключи объекта, которые он хранит, могут привести к тому, что коллекция попадет в непредвиденное состояние.Опять же, это зависит от того, использует ли метод equals атрибут, который вы изменяете, для сравнения.

Самый безопасный способ - изменить объект перед помещением его в коллекцию.

1 голос
/ 27 июля 2010

Одно из хороших правил проектирования - не выставлять наполовину построенный объект сторонней подсистеме.

Итак, согласно этому правилу, инициализируйте ваш объект в соответствии с вашими способностями, а затемдобавьте его в список.

Если objects - это ArrayList, тогда чистый результат, вероятно, тот же, однако изображение, если objects - это особая разновидность List, которая вызывает какое-то уведомлениесобытие каждый раз, когда новый объект добавляется к нему, тогда порядок будет иметь большое значение.

0 голосов
/ 27 июля 2010

Конечно, в этом случае изменение объекта является частью мысли «создать объект», и поэтому должно быть сгруппировано с конструктором как таковым. После того, как вы «создаете объект», вы «добавляете его в коллекцию». Таким образом, я бы сделал B и, возможно, даже добавил бы пустую строку после модификации, чтобы уделить больше внимания двум отдельным мыслям.

0 голосов
/ 27 июля 2010

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

Одна вещь, с которой вам следует быть осторожным, это убедиться, что у вас есть правильная ручка для объекта, который вы хотите изменить.

0 голосов
/ 27 июля 2010

Я думаю, что в любом случае это одно и то же, лично мне нравится Б

0 голосов
/ 27 июля 2010

По моему мнению, это зависит от установленного атрибута и типа коллекции, если коллекция - это Set, а атрибут имеет infulance для метода, равного или hascode, тогда определенно я установлю это свойство, прежде чем это также относится к списку сортировки и т.д. в других случаях это не имеет значения. Но для этого примера, где создается объект, я сначала установлю атрибуты, чем добавлю в коллекцию, потому что код лучше организован.

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