Java возвращает объект / изменяет объект (рекомендации по кодированию) - PullRequest
6 голосов
/ 07 июля 2011

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

public Obj populate(Obj o)
{
....
return o;
}

public void populate(Obj o)
{
....
}

Я знаю, что это тривиальный вопрос, но какой из них является наиболее предпочтительным?

Ответы [ 6 ]

2 голосов
/ 07 июля 2011

Я бы пошел с Разделение команд-запросов в общем.

То есть, если метод изменяет аргумент, он также не должен возвращать аргумент.

Однако существуют (как отмечалось в статье в википедии выше) ситуации, когда уместно нарушать этот общий принцип.

2 голосов
/ 07 июля 2011

Я зависит от вашего стиля, но есть одно преимущество возврата: вы можете вызывать populate(o).doSomethingElse();, то есть вы можете связывать вызовы методов.

Посмотрите, как, например, StringBuilder делает это, что позволяет такие вещи new StringBuilder().append("a").append("b")....

1 голос
/ 07 июля 2011

Я бы сказал, «первый» вариант, чтобы вернуть объект.Это не имеет недостатков и оставляет вам «пространство» для внесения изменений в реализацию в будущем (например, возврат «глубокой копии» вместо того же объекта) без изменения подписи.

Короче говоря,я вижу это более гибким.

0 голосов
/ 07 июля 2011

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

0 голосов
/ 07 июля 2011

Предпочтительно изменить объект this и оставить аргументы без изменений.

class ModifiedType {
    public ModifiedType populate(UnmodifiedType arg) {
         return this;
    }
    // or
    public void populate(UnmodifiedType arg) {

    }
}

См. Пример StringBuilder.

0 голосов
/ 07 июля 2011

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

public Obj populate(Obj o)
{
    Obj returnObj = o.clone();
    ....
    return returnObj;
}

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

...