Зачем нужны геттеры и сеттеры java
Перейти к содержимому

Зачем нужны геттеры и сеттеры java

  • автор:

Геттеры и сеттеры

Если переменная имеет уровень доступа private , к ней невозможно обратиться извне класса, в котором она объявлена. Но все равно необходим способ обращения к private переменным из другого класса, иначе такие изолированные переменные не будут иметь смысла. Это достигается с помощью объявления специальных public методов. Методы, которые возвращают значение переменных, называются геттеры. Методы, которые изменяют значение свойств, называются сеттеры.

Существуют правила объявления таких методов, рассмотрим их:

  1. Если свойство НЕ типа boolean , префикс геттера должно быть get. Например: getName() это корректное имя геттера для переменной name .
  2. Если свойство типа boolean , префикс имени геттера может быть get или is . Например, getPrinted() или isPrinted( ) оба являются корректными именами для переменных типа boolean .
  3. Имя сеттера должно начинаться с префикса set. Например, setName() корректное имя для переменной name .
  4. Для создания имени геттера или сеттера, первая буква свойства должна быть изменена на большую и прибавлена к соответствующему префиксу ( set , get или is ).
  5. Сеттер должен быть public , возвращать void тип и иметь параметр соответствующий типу переменной. Например:

public void setAge(int age) < this.age = age; >​
public int getAge() < return age; >​

В языке Java при проектировании классов принято ограничивать уровень доступа к переменным с помощью модификаторов private или protected и обращаться к ним через геттеры и сеттеры.

Существует также такое понятие как JavaBeans классы — это классы содержащие свойства. В Java мы можем рассматривать свойства как private переменные класса. Так как они private , доступ к ним извне класса может быть осуществлен только с помощью методов класса.

Рассмотрим пример реализации концепции JavaBeans на классе Person , у которого есть три переменные. Они объявлены как private и доступ к ним возможен только через соответствующие геттеры и сеттеры

public class Person < private String fullName; private int age; private boolean retired; public Person() < >public Person(String fullName, int age, boolean retired) < this.fullName = fullName; this.age = age; this.retired = retired; >public String getFullName() < return fullName; >public void setFullName(String fullName) < this.fullName = fullName; >public int getAge() < return age; >public void setAge(int age) < this.age = age; >public boolean isRetired() < return retired; >public void setRetired(boolean retired) < this.retired = retired; >> 
public class PersonDemo < public static void main(String[] args) < Person person = new Person(); person.setFullName("Петров Иван Иванович"); person.setAge(56); person.setRetired(false); System.out.println("Полное имя " + person.getFullName()); System.out.println("Возраст " + person.getAge()); System.out.println("Пенсионер? " + person.isRetired()); >> 

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

Рассмотрим класс CircleWrong , у которого две переменные — радиус и диаметр, объявленные с уровнем доступа по умолчанию.

public class CircleWrong

Любой класс в том же пакете может обратиться к ним напрямую и изменить их значение. Значения этих двух переменных должно соответствовать друг другу, но пользователь этого класса может задать любые значения, например:

public class CircleWrongDemo < public static void main(String[] args) < CircleWrong circle = new CircleWrong(); circle.diam = 25; circle.radius = 10; System.out.println("Диаметр: " + circle.diam); System.out.println("Радиус: " + circle.radius); >>

Это может привести к неправильным дальнейшим вычислениям. Перепишем этот класс с использованием концепции JavaBeans, но немного изменим сеттеры. Метод setRadius() вместе с радиусом задает правильное значение для диаметра. Метод setDiam() написан соответствующим образом:

public class Circle < private int radius; private int diam; public int getRadius() < return radius; >public void setRadius(int radius) < this.radius = radius; this.diam = radius * 2; >public int getDiam() < return diam; >public void setDiam(int diam) < this.diam = diam; this.radius = diam / 2; >>

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

public class CircleDemo < public static void main(String[] args) < Circle circle = new Circle(); circle.setDiam(25); circle.setRadius(10); System.out.println(circle.getDiam()); System.out.println(circle.getRadius()); >>

В следующем примере рассмотрим возможности геттера. Класс User содержит две переменные — логин и пароль. Пароль содержит чувствительную информацию, которую не рекомендуется показывать. Достигается это с помощью объявления переменной с модификатором private и доступом к ней только через геттер метод, в котором вместо полного пароля показываем только первую букву, а остальные заменяются звездочками:

public class User < private String login; private String password; public User(String login, String password) < this.login = login; this.password = password; >public String getLogin() < return login; >public void setLogin(String login) < this.login = login; >public String getPassword() < return password.charAt(0) + "*****"; >public void setPassword(String password) < this.password = password; >>
public class UserDemo < public static void main(String[] args) < User user = new User("mylogin", "mypassword"); System.out.println("Логин: " + user.getLogin()); System.out.println("Пароль: " + user.getPassword()); >>
Логин: mylogin Пароль: m*****

Зачем нужны getter and setter методы? [дубликат]

Давно уже пишу на java и я привык свойства класса делать приватном и писать для них гетер и сетер методы но я понял что не знаю зачем это нужно? Ведь если у тебя есть метод сетер и гетер к свойству не легче сделать его публичном и использовать?

Отслеживать
13.8k 12 12 золотых знаков 44 44 серебряных знака 77 77 бронзовых знаков
задан 21 ноя 2018 в 2:36
Fariz Mamedow Fariz Mamedow
1,447 2 2 золотых знака 10 10 серебряных знаков 21 21 бронзовый знак

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Если у вас действительно никакой логики в геттерах сеттерах нет (и не предвидится), а только «пустышки», то вы только захламляете код лишними методами. Вспомните YAGNI — то что вы планируете может вам никогда не понадобится, но вы уже платите цену за возросшую сложность кода.

То что что-то можно использовать, не значит что это будет использовано. А то можно сразу и историю к каждому полю прицепить, и стэк, и логгирование .. но обычно не нужно.

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

Отслеживать
ответ дан 21 ноя 2018 в 5:10
13.8k 12 12 золотых знаков 44 44 серебряных знака 77 77 бронзовых знаков

Методы get() и set() нужны не только для того, чтобы получить доступ к данным, но и чтобы не допустить некорректной работы с ними.

private int n = 1; int[] array = new int[5]; public void setN(int n) < if (n >= 0 && n

В данном случае, если мы захотим изменить n вызвав метод setN(), то при вызове метода method(), не будет ошибки из-за выхода за пределы массива.

Как работают геттеры и сеттеры java

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

Например создадим класс User:

public class User  private int id; private String name; // возможно тут будет конструктор. // получаем значение поля id public int getId()  return id; > // записываем значение в поле id public void setId(int id)  this.id = id; > // получаем значение поля name public String getName()  return name; > // записываем значение в поле name public void setName(String name)  this.name = name; > > 

Создадим экземпляр класса User и применим к нему геттеры и сетторы:

User user = new User(); //Зададим значение полей через сеттеры user.setId(1); user.setName("Mark"); //Получим значения полей через геттеры String name = user.getName(); int id = user.getId(); 

Геттеры и Сеттеры

Следующее понятие из мира ООП, которое следует рассмотреть — это геттеры и сеттеры (getter — от англ. «get» — получать, и setter — от англ. «set» — устанавливать). Это общепринятый способ вводить данные («set») или получать данные («get»). Например, у меня есть класс Cat — кошка. Я задаю (используя setter) имя, пол, цвет глаз и окрас кошки (или кота):

А потом, если нужно узнать, какое у кошки имя — получаю с помощь getter — в данном случае get CatName :

Зачем они нужны?

Действительно — если я сам все задаю, зачем все эти геттеры и сеттеры?

Тут, нам стоит вспомнить про такой принцип ООП как инкапсуляция (если Вы не знаете, что это такое, вернитесь назад и прочитайте статью «Что такое ООП»). С помощью геттеров и сеттеров Вы защищаете содержимое программы — когда ей пользуется кто-то другой.

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

Как это работает?

Итак, как уже стало понятно, геттеры и сеттеры выполняют важную миссию защиты данных Вашей программы. Давайте рассмотрим, как это происходит на практике, и представим, что у нас есть такой класс Cat:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *