Объясните мне, что такое сеттер и геттер - PullRequest
11 голосов
/ 16 апреля 2010

Что такое сеттеры и геттеры? Зачем они мне нужны? Что является хорошим примером их эффективного использования? Какой смысл сеттера и геттера?

Обновление: Могу ли я получить примеры кодирования, пожалуйста?

Ответы [ 6 ]

13 голосов
/ 16 апреля 2010

Получатель - это метод, который получает значение свойства. Сеттер - это метод, который устанавливает значение свойства. Есть некоторые разногласия по поводу их эффективности, но, как правило, это:

  • для полноты инкапсуляции

  • для поддержания согласованного интерфейса в случае изменения внутренних деталей

Более полезно, когда вам нужно добавить некоторую логику для получения или установки, например, для проверки значения перед его записью.

9 голосов
/ 16 апреля 2010

Метод получения / установки используется, чтобы скрыть приватное поле от публичности (вы можете избежать прямого доступа к полю).

Получатель позволяет вам проверить предоставленное значение, прежде чем использовать его во внутреннем поле. Установщик позволяет, например, применять другой формат или просто ограничивать доступ для записи (например, для производных классов).

Полезным приложением метода получения может быть какая-то ленивая загрузка: вспомогательное поле (приватное поле, скрытое средством получения) инициализируется нулем. Когда вы просите получатель вернуть значение, он проверит нулевое значение и загрузит значение более трудоемким методом. Это произойдет только при первом вызове, позже получатель будет постоянно предоставлять уже загруженное значение.

4 голосов
/ 16 апреля 2010

Методы получения и установки отделяют интерфейс (функции получения / установки) от реализации (как на самом деле хранятся данные).

2 голосов
/ 14 июня 2011

Один вопрос, который может возникнуть из-за этого, заключается в том, что использование метода вместо прямого доступа к полю может снизить производительность. Ответ на самом деле не так, как компиляторы оптимизируют код, так что если ваш метод выполняет только return field;, где field - это поле в вашем классе, которое вы скрываете с помощью setter / getter, он фактически получит прямой доступ к полю. Таким образом, в большинстве случаев вы получаете одинаковую производительность, но при этом сохраняете возможность позже изменить методы set / get.

Эффективное программирование на Java в Joshua Block - отличная книга с советами о том, как писать хороший код, а также с объяснениями, почему. Почему использование setter / getter является одним из советов.

Примечание: вы можете заметить, что в некоторых книгах / документах поля, которые представляют установщик / получатель вместо прямого доступа, называются «свойствами» вместо полей. Например. в C # вы даже можете указать, что поле является свойством, и вам больше не нужно определять set / get (хорошая функция, я думаю).

2 голосов
/ 16 апреля 2010

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

Напротив, если вы предоставляете свои элементы данных непосредственно пользователю объекта, пользователь может изменять их по своему желанию, и объект даже не будет знать, что они были изменены.

Не хотите, чтобы люди читали данные члена? Сделайте элемент данных закрытым и не пишите метод получения, который возвращает значение. Не хотите, чтобы люди модифицировали член данных? Сделайте элемент данных закрытым и не пишите для него установщик. Хотите контролировать диапазон допустимых значений? Поместите это в сеттер.

1 голос
/ 16 апреля 2010

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

Обычно это не помогает при инкапсуляции, кроме случаев, упомянутых Джейсоном С.

Пример Java для некоторого символа, загруженного из базы данных, но должен быть представлен как логическое значение

char boolFromDb;

public boolean getBoolFromDb() {
    return boolFromDb == 'T';
}

public void setBoolFromDb(boolean newValue) {
    boolFromDb = newValue ? 'T' : 'F';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...