Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Использование геттеров и сетторов

#java #ооп


Есть ли смысл использовать геттеры и сеттеры внутри классов их содержащих?
    


Ответы

Ответ 1



Смотрите. Есть большая разница между использованием сеттера, и использованием ассоциированного поля. Эта разница — в семантике операции. Использование сеттера означает «установить логическое значение свойства, и выполнить все связанные с этим побочные эффекты». Например, если у вас есть несколько связанных полей, это может обновить значения других полей тоже. Если у вас модификация свойства должна отправлять нотификацию подписчикам, нотификация будет отправлена. Использование поля означает «изменить физическое хранилище свойства», тут внимание акцентируется не на логике, а на механизме хранения. Это низкоуровневая операция, и после её выполнения, возможно, вам понадобится выполнить нужные побочные эффекты вручную. Отсюда следует и различие в использовании. Большую часть времени вам нужно присвоение через сеттер: код сеттера позаботится о том, чтобы данные остались в консистентном состоянии, и контракты были выполнены. Но существуют и случаи, когда вам нужно, наоборот, обратить внимание на механику и воспользоваться полем. Типичный случай этого — это ситуация, когда у вас значения двух полей связаны, и сеттер одного свойства должен установить значение и другого свойства тоже. В этом случае он, скорее всего, должен записывать непосредственно в поле связанного свойства, чтобы избежать бесконечной рекурсии. Другой типичный случай — сеттер производит затратную валидацию значения, а вам точно известно, что значение правильное, и вы хотите этой валидации избежать. То, что в текущей реализации ваш сеттер лишь присваивает значение полю, не так уж и важно. Через некоторое время, с увеличением сложности вашего кода, сеттер может разрастись, и тогда, если вы не пользовались сеттером, вам придётся пересмотреть код класса, чтобы понять, в каком из случаев вам нужен логический (класс остаётся в правильном состоянии), а в каком — физический эффект присвоения (просто значение поля меняется, и всё). Поэтому лучше подумать заранее и установить значение нужной образом. А с геттером ситуация точно такая же. Единственная разница — геттер реже имеет побочные эффекты. (Но вполне может, например, если у вас ленивое вычисление начального значения свойства.)

Ответ 2



Как верно замечено в комментарии, зависит от необходимости выполнения дополнительных действий над полем. Если вы не производите дополнительных действий, то разницы очевидно нет. Но если вдруг понадобится делать проверку на null поля(при ленивой инициализации) или валидировать входные данные при использовании сеттера, то везде где используется это поле придется модифицировать код. одно из назначений геттеров и сеттеров - это единая точка доступа к полю.

Ответ 3



Зависит от того в каком стиле вы пишете код. Если ваши классы имеют не больше нескольких методов, то в таком случае для приватных полей в приватных геттерах и сеттерах надобности нет никакой. Даже если и появится какое-то изменение, то проблем оно не доставит, а вот лишние методы в виде приватных геттеров и сеттеров прибавят работы и увеличат размеры классов А если у ваших классов методов много, например несколько десятков, то тогда стоит задуматься о точках доступа и к приватным полям внутри класса тоже. В таком случае это по идее может упростить дальнейшее сопровождение программы.

Комментариев нет:

Отправить комментарий