Некоторые преимущества использования геттеров и сеттеров (известные как encapsulation
или data-hiding
):
(первоначально ответили здесь )
1. Поля класса могут быть сделаны только для чтения (только путем предоставления метода получения) или только для записи (путем предоставления только метода установки). Это дает классу полный контроль над тем, кто может получить доступ к его полям или изменить их.
Пример: * * один тысяча двадцать-одна
class EncapsulationExample {
private int readOnly = -1; // this value can only be read, not altered
private int writeOnly = 0; // this value can only be changed, not viewed
public int getReadOnly() {
return readOnly;
}
public int setWriteOnly(int w) {
writeOnly = w;
}
}
2. Пользователям класса не нужно знать, как класс на самом деле хранит данные. Это означает, что данные отделены и существуют независимо от пользователей, что позволяет более легко модифицировать и поддерживать код. Это позволяет сопровождающим вносить частые изменения, такие как исправление ошибок, улучшения дизайна и производительности, при этом не затрагивая пользователей.
Кроме того, инкапсулированные ресурсы доступны каждому пользователю одинаково и имеют идентичное поведение, независимое от пользователя, поскольку это поведение определено внутри класса.
Пример (получение значения):
class EncapsulationExample {
private int value;
public int getValue() {
return value; // return the value
}
}
А что если я хочу вместо этого вернуть дважды значение? Я могу просто изменить свой геттер, и весь код, который использует мой пример, не нужно менять, и я получу двойное значение:
class EncapsulationExample {
private int value;
public int getValue() {
return value*2; // return twice the value
}
}
3. Делает код чище, более читабельным и понятным.
Вот пример:
Нет инкапсуляции:
class Box {
int widthS; // width of the side
int widthT; // width of the top
// other stuff
}
// ...
Box b = new Box();
int w1 = b.widthS; // Hm... what is widthS again?
int w2 = b.widthT; // Don't mistake the names. I should make sure I use the proper variable here!
С инкапсуляцией:
class Box {
private int widthS; // width of the side
private int widthT; // width of the top
public int getSideWidth() {
return widthS;
}
public int getTopWIdth() {
return widthT;
}
// other stuff
}
// ...
Box b = new Box();
int w1 = b.getSideWidth(); // Ok, this one gives me the width of the side
int w2 = b.getTopWidth(); // and this one gives me the width of the top. No confusion, whew!
Посмотрите, насколько больше у вас контроля над информацией, которую вы получаете, и насколько яснее это во втором примере. Имейте в виду, этот пример тривиален, и в реальной жизни классы, с которыми вы будете иметь дело, имеют много ресурсов, к которым обращаются различные компоненты. Таким образом, инкапсуляция ресурсов проясняет, к каким из них мы обращаемся и каким образом (получение или настройка).
Вот good SO thread
по этой теме.
Здесь good read
для инкапсуляции данных.