Свойства в ООП (getters, setters)
Last updated: 3 мая 2025 г.Поля любого класса не должны быть доступны напрямую, они всегда должны быть 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 // используем сеттер для записи значения
45 // в поле color объекта somecat.
46
47 // setColor публичный метод, поэтому
48 // можем к нему обратиться напрямую.
49 somecat.setColor("Black");
50
51 // Используем геттер, который извлечет
52 // нам из объекта значение color.
53 System.out.println(somecat.getColor());
54 }
55}
Вывод:

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

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