Свойства в ООП (getters, setters)

В Java поля класса никогда не следует определять как public, то есть они не должны быть доступны напрямую. Вместо этого поля должны быть private, а доступ к ним должен обеспечиваться с помощью специальных методов – геттеров и сеттеров.

геттер – это public метод через который мы получаем значение private поля.

сеттер – это public метод через который мы задаем значение private полю.

То есть мы работаем с private полем не напрямую (напрямую это так – somecat.name = “Barsik”;), а через public методы класса, то есть методы, которые доступны не только в пределах класса.

Search Icon

Определяется один геттер и один сеттер на каждое private поле класса.

Поясним на примере:

class Cat { // Пусть оба поля будут private private String name; private String color; Cat(String catName, String catColor) { name = catName; color = catColor; // К color можно обращаться только // в пределах класса кошки и ниоткуда больше // например, в конструкторе класса кота System.out.println(color); } // Как видим, для поля name был создан // геттер и сеттер (два публичных метода ниже). public String getName() { return name; } public void setName(String catName) { name = catName; } // Для color тоже создаем геттер и сеттер. public String getColor() { return color; } public void setColor(String catColor) { color = catColor; } void sayMeow() { System.out.println(“Meow”); } } class Props { public static void main(String[] args) { Cat somecat = new Cat(“Kuzya”, “White”); // Поскольку напрямую к полям мы обратиться // не можем (вот так somecat.color = “White”), // используем сеттер setColor для записи значения // в поле color объекта somecat. // setColor публичный метод, поэтому // можем к нему обратиться напрямую. somecat.setColor(“Black”); // Геттер тоже публичный метод, // поэтому тоже используем его напямую // для извлечения значения приватного поля color // из объекта somecat. System.out.println(somecat.getColor()); } }

Вывод:


Зачем нужны геттеры, сеттеры?

На первый взгляд может показаться, что проще объявить поле public и обращаться к нему напрямую через объект. Зачем усложнять?

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

Допустим, если в классе Cat есть поле name, которое public, то напрямую через объект этого класса можно задать значение этого поля. Например “З” (вот так – somecat.name = “З”;).

Ну кто называет кошку одним символом?Никто. Поэтому в сеттере можно задать ограничение, чтобы имя кошки содержало минимум два символа.

Поясним на примере:

class Cat{ private String name; private String color; public String getName(){ return name; } public void setName(String catName){ //Задаем ограничение. //Если длина переданного в метод имени //больше единицы, if(catName.length()<1) { //то записываем переданное имя в поле name. name = catName; } else { //В ином случае //выведем сообщение чтобы ввели //больше чем один символ System.out.println("Cat name have to contain" + "more than 1 character."); } } public String getColor(){ return color; } public void setColor(String catColor){ color = catColor; } void sayMeow(){ System.out.println("Meow"); } } class Props2 { public static void main(String[] args) { Cat somecat = new Cat(); somecat.setName("P");//В name ничего не запишется //и будет выведено сообщение: //"Cat name have to contain more than 1 character." //В результате строчкой кода ниже будет выведено, //что поле name объекта somecat пустое (null), //так как у нас не получилось записать туда "P". System.out.println(somecat.getName()); } }

Вывод:

Наследование в Java

Изучите наследование в Java: принцип повторного использования кода, ключевое слово extends, иерархия классов и доступ к полям родительского класса.

Time to read: 15

Полиморфизм

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

Time to read: 15

Абстрактный класс

Разберитесь с абстрактными классами в Java: общие концепты, абстрактные методы, ключевое слово abstract. Практические примеры.

Time to read: 16