Является ли хорошей практикой передавать ссылки объектов на методы в Java? - PullRequest
2 голосов
/ 08 июля 2011

Является ли приемлемым стиль для передачи ссылки на объект в метод (в качестве параметра) и изменения объекта в этом методе, или этот метод должен возвращать ссылку на новый объект? Какова лучшая практика и почему?

Ответы [ 4 ]

4 голосов
/ 08 июля 2011

По умолчанию, когда вы передаете объекты методу, вы делаете это по ссылке. Если объекты должны быть неизменяемыми, спроектируйте их так (например, String).

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

Я бы сказал, что лучше всего модифицировать объект this метода.Лучше не изменять объекты, передаваемые в качестве аргументов, даже если они изменчивы.Если вы собираетесь вернуть объект для создания цепочки, обычно лучше return this;, чем аргумент.

0 голосов
/ 21 декабря 2017

Избегайте "широких" параметров (ссылочная прозрачность / ясность намерения).

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

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

Пример

Сравните это:

Employee emp = ...;
Validator.checkIsEligibleForPPCTP(emp);

с этим:

Employee emp = ...;
Validator.checkIsEligibleForPPCTP(emp.getEmailAddress());

Какого черта PPCTP?Вам необходимо знание предметной области того, что является PPCTP.Все, что вы знаете, это то, что он будет смотреть на объект сотрудника и что-то делать.

Если, с другой стороны, вы избегаете прохождения всего объекта, а просто пропускаете то, что действительно актуально, читатели узнают больше о том, что происходит, без необходимости изучать определение checkIsEligibleForPPCTP.Могу поспорить, что вам легче представить, что делает этот метод проверки, благодаря тому, что мы передаем ему адрес электронной почты (на самом деле, даже если вы немного ошибаетесь в своем воображении, повествование часто бывает достаточно хорошим, когда речь идет о кодепонимание).


Дальнейшие мысли

(Слабый) контраргумент

Но что если нам в будущем понадобится еще одно поле из этого широкого объекта?Вам придется изменить подпись.

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

Этот твит является ответом на «префакторинг» / программирование «на будущее» (и это относится к проектированию на уровне методов):

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

Пояснения

Да, я знаю, что java.lang.String - это объект.И часто вам нужно пройти java.util.Collection.Они отличаются от «пользовательских объектов», потому что:

  • Строки являются неизменяемыми
  • Коллекции могут (и должны) быть неизменными копиями при передаче в качестве параметров
    • , если они являютсянет, ваш код будет труднее понять, потому что ваш метод становится состоящим из состояния / имеет побочные эффекты (т.е. это нечистая функция)

Если вы настаиваете на передаче объекта, вхотя бы сделать его неизменным.Но если вместо этого ваш объект emp является TLOYDEmployee, то вы снова затрудняетесь понять смысл кода, и все, что вам нужно, - это общее понимание смысла делового жаргона (парадокс использования-повторного использования).

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

Стоит ли однажды передать ссылку на объект методам и изменить их в методах или же методы> возвращают новые ссылки?

Его бесполезно .. зачем возвращать ??

Возвращается в основном в случае неизменных объектов.

Например

bigDecimalOb3 = bigDecimalOb1.add(bigDecimalOb2);
...