Использование геттера / сеттера внутри класса - хорошая или плохая практика?

Использование геттера / сеттера во внутреннем коде класса вместо прямого доступа к переменной экземпляра - это хорошая или плохая практика? По крайней мере, для установщиков можно добавить дополнительный код, проверяющий значение, но для геттеров это просто накладные расходы? Насколько интеллектуален компилятор Java, если мои геттеры / сеттеры просто устанавливают / получают значение напрямую, будет ли Java оптимизировать мой код и заменять геттеры / сеттеры прямым доступом к переменным экземпляра, чтобы не было накладных расходов на вызов метода?


person stefan.at.wpf    schedule 12.05.2012    source источник
comment
Возможный дубликат stackoverflow.com/questions/1568091/why- методы получения и установки   -  person Edwin Dalorzo    schedule 12.05.2012
comment
Что касается последней части вашего вопроса, да, современные JVM будут встраивать геттеры / сеттеры по мере необходимости.   -  person casablanca    schedule 12.05.2012
comment
@edalorzo - это не дубликат, здесь вопрос о внутреннем использовании членов класса.   -  person MByD    schedule 12.05.2012
comment
Что касается времени компиляции, я думаю, вы можете найти ответ здесь   -  person franco_valente    schedule 12.05.2012


Ответы (3)


Чаще обращаются к полю напрямую. Значение метода setFieldName более очевидно для программистов, использующих ваш код в других классах. Поскольку детали реализации скрыты, они могут не понимать, какие диапазоны значений приемлемы, поэтому имеет смысл сохранять поля частными и заставлять других разработчиков использовать сеттер. Но внутри вашего собственного класса аргументы в пользу использования сеттера намного слабее. Если вы посмотрите на исходный код java API, вы обнаружите, что методы получения и установки обычно не используются внутри класса.

person Thorn    schedule 12.05.2012
comment
На эту тему нет неправильного ответа, но мне понравился пример java api, поэтому я выбрал этот ответ. Благодаря этому, а также другим! - person stefan.at.wpf; 16.05.2012

Нет необходимости делать это внутри класса, если вы не хотите выполнять дополнительные операции в этих геттерах / сеттерах. Доступ к членам класса может быть прямым для класса внутри, как:

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

Что касается производительности - я честно думаю, что в большинстве случаев вы не должны об этом думать, вы должны решить, вызывать ли метод или обращаться напрямую с точки зрения читаемости, масштабируемости и обслуживания, а не с точки зрения того, займет ли это еще одна наносекунда. или не. Такой подход окупается в долгосрочной перспективе. Есть места для оптимизации, и вы должны действовать эффективно, но сохранение ясности и удобства сопровождения кода гораздо важнее, если база кода превышает 20 строк.

person MByD    schedule 12.05.2012

Прямой доступ - это хорошо. Однако никто не может сказать, что доступ к геттерам / сеттерам плохой внутри одного и того же класса. Если вы разрабатываете компонент Java, вы обязательно поймете, о чем я говорю. Думаю, вы пытаетесь получить пользовательский ввод JTextField в виде строки. В этом случае методы получения позволят вам делать множество вещей, включая усечение строк, обрезку, прописные, строчные буквы и т. Д. Если вы пытаетесь сделать все это, просто обращаясь к прямой переменной (например: String s = textField.getText ()), вам будет довольно сложно это сделать. Итак, я думаю, хорошо или плохо, зависит от ситуации и от того, что вы разрабатываете.

person JustCause    schedule 12.05.2012