Бесплатный курс по Java: от основ до продвинутого уровня
Свойства в ООП (getters, setters)
В Java поля класса никогда не следует определять как public, то есть они не должны быть доступны напрямую. Вместо этого поля должны быть private, а доступ к ним должен обеспечиваться с помощью специальных методов – геттеров и сеттеров.
геттер – это public метод через который мы получаем значение private поля.
сеттер – это public метод через который мы задаем значение private полю.
То есть мы работаем с private полем не напрямую (напрямую это так – somecat.name = “Barsik”;), а через public методы класса, то есть методы, которые доступны не только в пределах класса.
Определяется один геттер и один сеттер на каждое 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());
}
}