Java

Зачем нужна такая запись?

JavaВыделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Point {
private double x;
private double y;

public Point(double x, double y) {
this.x = x;
this.y = y;
}

public double getX() {
return x;
}

public void setX(double x) {
this.x = x;
}

public double getY() {
return y;
}

public void setY(double y) {
this.y = y;
}

}
Геттеры/сеттеры нужны для добавления возможности полиморфизма при обращении к атрибутам класса.

Если в будущем понадобится добавить дочерний класс, скажем MovingPoint, у которого при получении координат нужно каждый раз производить вычисления, то в случае использования геттеров достаточно переопределить методы getX() и getY() и работать с ним так же как и с обычным Point. Вот так:

Point p1 = new Point(10, 0);
Point p2 = new MovingPoint(20, 0);
. .
if (p1.getX() < p2.getX()) . .
. .

в if'е p1.getX() возвращает значение аттрибута x, а p2.getX() может производить какие-то хитрые вычисления.
Сергей Савельев
Сергей Савельев
25 874
Лучший ответ
Инкапсуляция, доведённая до абсурда. Причём в данном конкретном случае абсолютно бессмысленная. По смыслу полностью эквивалентно
public class Point {
public double x;
public double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
, но зато автор может с гордостью заявлять, что доступ к данным его класса "защищён".
ИМ
Иван Макаров
65 456
Andrei Mazur обычный POJO ...
что там обсурдного? это фактически стандарт
Это стандартный способ Java-программистов для увеличения исходного текста и замедления программы.
Попробую объяснить, зачем это придумано. Представьте, что этот класс является частью библиотеки, которая используется в разных проектах. В новой версии библиотеки может понадобиться добавить какой-то код в геттеры/сеттреры. Если бы класс не был доступен как часть библиотеки, можно было бы преобразовать поле в свойство (private поле с геттером/сеттером), с заменой по всему проекту, для этого есть инструмент в IDE. Но для библиотеки такая замена недопустима: придётся менять код всех проектов, в которых используется библиотека. И это нежелательно для большого проекта, когда вашим классом пользуются другие программисты. Поэтому все атрибуты сразу оформляют как свойства: на всякий случай и для однообразия.
Но если у вас небольшой проект, и вы уверены, что в геттерах/сеттерах не нужен код, то нет смысла так делать.
Ещё есть фреймворки (библиотеки), ориентированные только на работу с геттерами/сеттерами, а не с полями.
Al
Alisher
36 282
Виктор Дегтярёв Странно, что вы не упоминаете возможность полиморфизма при обращении к атрибутам класса, при использовании геттеров/сеттеров.

Если в том же проекте понадобится добавить дочерний класс, ну скажем MovingPoint, у которого при получении координат нужно каждый раз производить вычисления, но в остальном вся работа с ним будет идти абсолютно так же, то без использовании геттеров/сеттеров реализовать это будет проблематично.
Ненужная хрень как геттеры и сеттеры.
Единственное применение - фреймворки/библиотеки, где это действительно необходимо для удобства.

Стоит их использовать - если есть дополнительные операции во время взятия/присваивания переменной. Иначе - делать публичными переменными и брать их.
Но даже так, лучше назвать метод по другому, а не просто getA()
Например computeAndGetA().

--
Я раньше бездумно использовал их, полагая это нужно и полезно.
А на деле - лишняя морока. Даже используя lombok, где автоматически, во время сборки проекта, собираются геттеры и сеттеры, где указана аннотация Getter/Setter.

--
Когда можно красиво:
a.b = c.d;
а не:
a.setB(c.getD());

--
анализируя огромный проект, натыкаясь на геттеры, можно получить большую дорожку, переходя по классам.
Сергей Послов
Сергей Послов
8 005
Сергей Савельев При создании дочернего класса getA() можно переопределить, а обращение к атрибуту напрямую, переопределить не получится.

И что там происходит при получении A (compute или не compute) получателя атрибута не должно волновать, в этом суть инкапсуляции.
такие классы легко используются для сериализации/десериализации
фактически в Java такое оформление является стандартом соответствуя OOP парадигме
и как следствие хорошим тоном.
Муратбек Монолов вот полезная ссылока для понимания
https://ru.wikipedia.org/wiki/JavaBeans

также погугли по JavaBeans name standart
К приватным переменным класса можно только через публичные методы обращаться.
Alisher Можно. Но зачем делать приватные переменные в данном случае?