Почему методы установки и получения
Возможный дубликат:
Зачем использовать геттеры и сеттеры?
Я знаю, что это очень тривиально. Но почему мы определяем private, а затем используем getter и setters. Это больше похоже на предотвращение ошибок программистов при использовании закрытых переменных или методов? Или это из соображений безопасности. Если по соображениям безопасности, то какой смысл иметь геттеры или сеттеры? Я знаю, что у нас могут быть ограничения внутри геттера и сеттера, но эти условия if в основном предназначены для предотвращения ошибок, а не для ограничений конфиденциальности. Например, мы обычно не говорим, что для этих членов доступ к этому методу ограничен предложением if.
Благодарю.
7 ответов
Практика автоматического, бездумно создавая getX()
а также setX()
методы для каждой переменной плохие. Как вы уже заметили, это в основном бессмысленно.
Но это бездумная часть, это плохо. Методы бесконечно лучше, чем открытые переменные, потому что, как вы уже заметили, вы можете контролировать доступ к базовым данным. Если вы думаете о том, что делаете, и применяете мутаторы и аксессоры в зависимости от ситуации, это замечательный инструмент:
- Вы можете ограничить клиентов только чтением, но не записью в переменную.
- Вы можете ограничить значения целого числа только положительными значениями (например).
- Вы можете убедиться, что одна переменная всегда равна половине значения другой (например).
- Вы можете убедиться, что в любое время, когда значение переменной изменяется, отправляется событие для уведомления других клиентов.
- Вы можете изменить тип данных базовой переменной, выполнить преобразования в открытых методах и не нарушать работу каких-либо клиентов.
- Вы можете преобразовать объект в удаленный клиент для серверной версии того же объекта, и снова код клиента не изменится.
- Вы можете обеспечить строгое упорядочение памяти между потоками, используя
synchronized
аксессоры.
Это только некоторые из вещей, которые вы можете делать с мутаторами и аксессорами. Используя их, вы делаете свое программное обеспечение легко изменяемым и простым в обслуживании.
Если кто-то разрешает редактировать переменные из класса, то могут произойти очень плохие вещи. (например, если неосторожный пользователь меняет знаменатель на ноль, мы можем уничтожить юниверс [или получить ошибку деления на ноль]). определяющий get()
а также set()
методы позволяют вам (программисту) точно определить, как другие могут взаимодействовать с вашими переменными.
Setter amd Getter Метод, в основном используемый для ограничения любых изменений другим человеком. На языке Java мы предлагаем концепцию скрытия данных. Это достигается за счет получения и установки метода.
Есть еще одно преимущество, если вы используете методы получения и установки, это позволяет подклассу переопределять способ доступа к информации с помощью метода и большей гибкости.
На примере приведу пояснение. Предположим, у нас есть следующий класс:
class User {
private String username;
private String password;
}
Теперь в командном проекте, где работают несколько программистов. Программист А разработал User
класс и программист B должны работать на интерфейсе GUI. Политика решила, что password
поле не может быть менее 5 символов. Но если вы не сделали поля данных private
и A, и B всегда должны проверять действительность нового пароля, назначаемого password
поле.
Теперь предположим, что после их private
Вы реализуете следующий метод установки:
public boolean setPassword( String temp ) {
if( temp.length() >= 5 ) {
this.password = temp;
return true;
}
else {
return false;
}
}
Таким образом, только A должен его кодировать один раз, а B - просто использовать его, не беспокоясь о политике. Это всегда поощряет правило СУХОЙ (не повторяйся).
Мы используем частные поля и имеем методы получения и установки, чтобы эти частные поля могли быть доступны для других классов. Если у меня есть два класса в проекте, скажем, Car.java и Driver.java, мы хотим, чтобы объекты Driver могли иметь доступ к закрытому полю "wheel" в Car.java (иначе драйвер не сможет управлять автомобилем). Но если поле является закрытым, доступ к нему можно получить только с помощью метода получения, который возвращает значение поля. Сеттеры позволяют внешним классам изменять значения полей. Вы можете избежать использования методов получения и установки, сделав ваши поля общедоступными (или защищенными, где это уместно) вместо личных.
Он позволяет вам контролировать доступ к вещам..... инкапсулируя доступ к фрагменту данных, вы можете свободно изменять местоположение этих данных или даже делать их вычислимыми. т. е. вместо того, чтобы возвращать значение поля, вы делаете некоторые вычисления.
Но, как бы ни были геттеры и сеттеры, если вы используете их слишком часто, это признак того, что вы не получаете объект для выполнения той работы, которая ему нужна.