Хорошая практика для редактирования объектов “ссылкой”?

Скажем, мне назвали тип Superstar. Теперь я хочу иметь метод, который делает некоторую работу и редактирует некоторые свойства a Superstar объект.

Вот два способа того, как я мог реализовать это. Путь 1 был бы следующим:

private Superstar editSuperstar(Superstar superstar){
    ....
    superstar.setEdited(true);
    return superstar;
}
...
superstar = editSuperstar(superstar);

И путь 2 был бы этим:

private void editSuperstar(Superstar superstar){
    ....
    superstar.setEdited(true);
}
...
editSuperstar(superstar);

Какой из этих двух возможных путей считают "лучшей практикой"? Первый или второе псевдо "ссылкой" один?

11
задан 16 July 2010 в 07:44
поделиться

5 ответов

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

Наконец, поскольку оба этих примера используют только объект Superstar, они должны быть методами-членами класса Superstar.

6
ответ дан 3 December 2019 в 07:10
поделиться

Первая форма обманчива. Создается впечатление, что передается один объект, который копируется, а затем копия изменяется и возвращается.

«Лучшей практикой» было бы использовать первую форму, но на самом деле делать то, что подразумевается (применить изменение к копии, которая затем будет возвращена). Неизменяемые объекты, как правило, предпочтительнее изменяемых, если только они не представляют собой большие объемные объекты, копирование которых дорого. В этом случае вам следует отдать предпочтение второй форме.

4
ответ дан 3 December 2019 в 07:10
поделиться

Используйте способ 2, если вы не создаете класс «построитель», в котором вы собираетесь объединять вызовы в цепочку. Пример:

MyClass c = (new MyClassBuilder()).setX(blah).setY(blah).build();
4
ответ дан 3 December 2019 в 07:10
поделиться

Проблема, которую вы имеете здесь с первым методом, заключается в том, что если вы используете его таким образом:

Superstar edited = editSuperstar(originalSuperstar);

Это также изменит originalSuperstar, что, на мой взгляд, противоречит интуиции...

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

Для этого необычного примера вы можете просто добавить метод edit в класс Superstar...

2
ответ дан 3 December 2019 в 07:10
поделиться

Первая форма будет неожиданной для клиентов API, если вы вернете тот же экземпляр, изменив только некоторые поля. Можно было бы ожидать получить обратно модифицированную копию без изменения исходного экземпляра.

Поэтому используйте вторую форму, если вы не возвращаете копию, и первую, если возвращаете (и подумайте о том, чтобы сделать Superstar неизменяемым в этом случае).

1
ответ дан 3 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: