Вы попросили простой пример, поэтому я приведу один. Предположим, вы разрабатываете класс круга. Круг можно охарактеризовать по диаметру:
public class Circle {
private double diameter;
public Circle(double diameter) {
this.diameter = diameter;
}
}
Звонящий может захотеть узнать диаметр круга, поэтому вы добавляете геттер:
public class Circle {
private double diameter;
public Circle(double diameter) {
this.diameter = diameter;
}
public double getDiameter() {
return this.diameter;
}
}
Возможно, вы также захотите получить площадь круга, поэтому вы добавляете геттер для этой области:
public double getArea() {
return Math.PI * (this.diameter / 2) * (this.diameter / 2);
}
И тогда вы понимаете, что использование радиуса, а не диаметра, проще для внутренних методов круга. Но вы хотите, чтобы все пользователи вашего класса оставались такими, как есть, чтобы не нарушать существующий код. Таким образом, вы изменяете внутреннюю часть класса, не меняя интерфейс:
public class Circle {
private double radius;
public Circle(double diameter) {
this.radius = diameter / 2;
}
public double getArea() {
return Math. PI * radius * radius;
}
public double getDiameter() {
return this.radius * 2;
}
}
И, наконец, вы хотите изменить диаметр круга, поэтому вы добавляете сеттер:
public void setDiameter(double diameter) {
this.radius = diameter / 2;
}
Но подождите, круг с отрицательным диаметром не имеет смысла, поэтому вы делаете метод более безопасным:
public void setDiameter(double diameter) {
if (diameter <= 0) {
throw new IllegalArgumentException("diameter must be > 0");
}
this.radius = diameter / 2;
}
Если бы вы предварительно вычислили площадь во время строительства, setDiameter также должен был бы изменить значение области:
public class Circle {
private double radius;
private double area;
public Circle(double diameter) {
this.radius = diameter / 2;
this.area = Math. PI * radius * radius;
}
public double getArea() {
return area;
}
public double getDiameter() {
return this.radius / 2;
}
public void setDiameter(double diameter) {
this.radius = diameter / 2;
// the area must also be changed, else the invariants are broken.
this.area = Math. PI * radius * radius;
}
}
Методы получения и установки - это просто методы. Но они следуют соглашениям об именах, которые упрощают понимание вашего кода и могут использоваться рядом платформ, которые полагаются на эти соглашения.