Свойства в ООП (getters, setters)
Last updated: 3 мая 2025 г.В Java поля класса никогда не следует определять как public, то есть они не должны быть доступны напрямую. Вместо этого поля должны быть private, а доступ к ним должен обеспечиваться с помощью специальных методов – геттеров и сеттеров.
геттер
– это public метод через который мы получаем значение private поля.
сеттер
– это public метод через который мы задаем значение private полю.
То есть мы работаем с private полем не напрямую (напрямую это так – somecat.name = “Barsik”;), а через public методы класса, то есть методы, которые доступны не только в пределах класса.
Определяется один геттер и один сеттер на каждое private поле класса.
Поясним на примере:
1class Cat {
2 // Пусть оба поля будут private
3 private String name;
4 private String color;
5
6 Cat(String catName, String catColor) {
7 name = catName;
8 color = catColor;
9 // К color можно обращаться только
10 // в пределах класса кошки и ниоткуда больше
11 // например, в конструкторе класса кота
12 System.out.println(color);
13 }
14
15 // Как видим, для поля name был создан
16 // геттер и сеттер (два публичных метода ниже).
17 public String getName() {
18 return name;
19 }
20
21 public void setName(String catName) {
22 name = catName;
23 }
24
25 // Для color тоже создаем геттер и сеттер.
26 public String getColor() {
27 return color;
28 }
29
30 public void setColor(String catColor) {
31 color = catColor;
32 }
33
34 void sayMeow() {
35 System.out.println("Meow");
36 }
37}
38
39class Props {
40 public static void main(String[] args) {
41 Cat somecat = new Cat("Kuzya", "White");
42 // Поскольку напрямую к полям мы обратиться
43 // не можем (вот так somecat.color = "White"),
44 // используем сеттер setColor для записи значения
45 // в поле color объекта somecat.
46
47 // setColor публичный метод, поэтому
48 // можем к нему обратиться напрямую.
49 somecat.setColor("Black");
50 // Геттер тоже публичный метод,
51 // поэтому тоже используем его напямую
52 // для извлечения значения приватного поля color
53 // из объекта somecat.
54 System.out.println(somecat.getColor());
55 }
56}
Вывод:

Зачем нужны геттеры, сеттеры?
На первый взгляд может показаться, что проще объявить поле public
и обращаться к нему напрямую через объект. Зачем усложнять?
Однако на деле, чтобы была возможность при необходимости накладывать ограничения на допустимые значения поля класса, нужно использовать сеттер. Сеттер — это обычный метод, а значит, мы можем добавить в него любую дополнительную логику, которая будет отфильтровывать недопустимые значения и не позволять им попасть в поле. Такой подход помогает контролировать данные, которые записываются в поля объекта, и предотвращает появление нежелательных значений.
Допустим, если в классе Cat есть поле name, которое public, то напрямую через объект этого класса можно задать значение этого поля. Например “З” (вот так – somecat.name = “З”;).
Ну кто называет кошку одним символом? – Никто. Поэтому в сеттере можно задать ограничение, чтобы имя кошки содержало минимум два символа.
Поясним на примере:
1class Cat{
2 private String name;
3 private String color;
4
5 public String getName(){
6 return name;
7 }
8
9 public void setName(String catName){
10 //Задаем ограничение.
11 //Если длина переданного в метод имени
12 //больше единицы,
13 if(catName.length()<1) {
14 //то записываем переданное имя в поле name.
15 name = catName;
16 }
17 else { //В ином случае
18 //выведем сообщение чтобы ввели
19 //больше чем один символ
20 System.out.println("Cat name have to contain"
21 + "more than 1 character.");
22 }
23 }
24
25 public String getColor(){
26 return color;
27 }
28
29 public void setColor(String catColor){
30 color = catColor;
31 }
32
33 void sayMeow(){
34 System.out.println("Meow");
35 }
36}
37
38class Props2 {
39 public static void main(String[] args) {
40 Cat somecat = new Cat();
41 somecat.setName("P");//В name ничего не запишется
42 //и будет выведено сообщение:
43 //"Cat name have to contain more than 1 character."
44
45 //В результате строчкой кода ниже будет выведено,
46 //что поле name объекта somecat пустое (null),
47 //так как у нас не получилось записать туда "P".
48 System.out.println(somecat.getName());
49 }
50}
Вывод:

Следующие уроки
Наследование в Java
15
мин.
Полиморфизм
15
мин.
Абстрактный класс
16
мин.