2012-01-26 1 views
5

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

class SomeClass{ 
    Foo updateWithContex(Foo foo){ 
     foo.setAppId(i); 
     foo.setXId(index); 
     //..... 
     return foo; 
    } 
} 

class Foo{ 

    public void setAppId(int appId) 
    { 
     // 
    } 
    public void setXId(int appId) 
    { 
     // 
    } 
    public void changeState(X x) 
    { 
     // 
    } 
} 

В C++, я видел такой код:

BigObject& 
    fastTransform(BigObject& myBO) 
    { 
     // When entering fastTransform(), myBO is the same object as the function 
     // argument provided by the user. -> No copy-constructor is executed. 
     // Transform myBO in some way 
     return myBO; // Transformed myBO is returned to the user. 
    } 

Это тоже не так?

+2

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

+0

@ buc: Правда, хорошая точка. Я был слишком быстр, тогда –

ответ

9

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

+0

Это имеет смысл! Но это принципиально неправильно? или это просто читаемость Кодекса? – yadab

+2

Это зависит от того, как вы определяете «принципиально неправильно» ... Не делает ли этот метод невозможным? Нет. Будет ли проклят ваше имя кем-либо, кто должен назвать ваш метод? Вероятно! – vaughandroid

+0

@vaughandroid, что лучше для этого? – user11235813

2

Ваш код должен выглядеть следующим образом:

class SomeClass{ 
    void updateWithContex(Foo foo){ 
     foo.setAppId(i); 
     foo.setXId(index); 
     //..... 
    } 
} 

Это плохая практика, потому что вы передаете ссылку на объект Foo, так что вы можете изменить его в методе updateWithContex без возвращения его обратно метод. Еще раз помните, что вы всегда работаете со ссылкой на Java. И, конечно же, нет способа сделать это в другом месте - это будет всегда ссылка на объект. Java не имеет ничего подобного: fastTransform (BigObject & myBO).

+0

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

+0

Я знаю, как работает ссылка на Java, поэтому я предоставил C++ refs для разъяснения необходимости. Мой вопрос: почему неправильно возвращать ту же Foo. Когда мы программируем с помощью сборки, тот же самый реестр изменяется и отбрасывается, почему бы не на Java? – yadab

+0

@Savino Sguera - updateWithContext является приватным пакетом. –

2

Я не вижу ничего плохого, это вопрос дизайна API. С кодом, который вы выложили вы можете сделать что-то вроде

someClass.updateWithContext(new Foo()).changeState(x); 

вместо

Foo foo = new Foo(); 
someClass.updateWithContext(foo); 
foo.changeState(x); 

Первый фрагмент кода является лучшим примером fluent interface, чем второй.

+0

Спасибо! Но мой случай немного отличается от того, на что вы ответили (цепочка методов не является моей проблемой). – yadab

1

Output Parameters in Java некоторые объекты являются изменяемыми некоторыми неизменяемыми. Безопасность потоков таких методов также сомнительна. Это можно сделать, но да, это обычно считается нехорошо и google для выходных параметров java. Надеюсь это поможет.

Смежные вопросы