отдых или реинициализация? - PullRequest
0 голосов
/ 04 января 2011

Много раз я сталкивался с ситуацией, когда есть цикл, и новый объект создается в начале цикла и добавляется в коллекцию.Например, псевдокод:

iterating over a resultset do
  create an object
  set instance data in object to some resultset data
  put object in collection
next

Как этот подход вместо этого?

create an object 
iterating over a resultset do
  set instance data in object to some resultset data
  put object in collection
next

Каковы плюсы и минусы обоих подходов?Что может быть быстрее?Есть ли лучший способ, чем два?

PS: я не знаю, какие метки ставить.Простите меня.

Ответы [ 2 ]

0 голосов
/ 04 января 2011

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

iterating over a resultset do
    create an object
    set instance data in object to some resultset data
    put object in collection
next

Но если язык просто возвращает ссылку на объект, и вы пытаетесь выполнить второй метод

create an object (x)
iterate over resultset do
    set instance data in object (x) to resultset data (returns a reference to x with updated data)
    put object in collection (puts a reference to x in collection)
next

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

0 голосов
/ 04 января 2011

Ваш окончательный псевдокод должен быть больше похож на:

create an object 
iterating over a resultset do
  set instance data in object to some resultset data
  **clone** object into collection
next

Поскольку в противном случае вы просто получили бы столько копий вашего конечного объекта, поскольку вы продолжали изменять тот же объект, на который добавляли ссылки. Таким образом, вы на самом деле не экономите пространство объекта или время создания. Второй метод вполне допустим, если по какой-то причине вы предпочли бы не переинициализировать каждый цикл, например, когда вам нужно изменить меньше элементов в каждом цикле, который вам придется инициализировать. Просто убедитесь, что конструктор копирования вашего объекта является надежным.

...