Переменные экземпляра делаются закрытыми, чтобы заставить пользователей этого класса использовать методы для доступа к ним.
В большинстве случаев существуют простые методы получения и установки, но могут использоваться и другие методы.
Использование методов позволит вам, например, ограничить доступ только для чтения, т. Е. Поле может быть прочитано, но не записано, если нет установщика. Это было бы невозможно, если бы поле было общедоступным.
Кроме того, вы можете добавить некоторые проверки или преобразования для доступа к полю, что было бы невозможно при обычном доступе к общедоступному полю. Если поле было общедоступным, и позже вы захотите принудительно разрешить весь доступ с помощью какого-либо метода, который выполняет дополнительные проверки и т. Д. Вам придется изменить все виды использования этого поля. Если вы сделаете это приватным, вам нужно будет изменить методы доступа позже.
Если phone
был приватным:
Рассмотрим этот случай:
class Address {
private String phone;
public void setPhone(String phone) {
this.phone = phone;
}
}
//access:
Address a = new Address();
a.setPhone("001-555-12345");
Если бы мы начали с класса, подобного этому, и позже потребовалось бы выполнить проверку на phoneNumber (например, некоторую минимальную длину, только цифры и т. Д.), Вам просто нужно изменить установщик:
class Address {
private String phone;
public void setPhone(String phone) {
if( !isValid( phone) ) { //the checks are performed in the isValid(...) method
throw new IllegalArgumentException("please set a valid phone number");
}
this.phone = phone;
}
}
//access:
Address a = new Address();
a.setPhone("001-555-12345"); //access is the same
Если phone
был публичным:
Кто-то может установить phone
так, и вы ничего не можете с этим поделать:
Address a = new Address();
a.phone="001-555-12345";
Если вы теперь хотите принудительно выполнить проверки достоверности, вам придется сделать это закрытым, и тот, кто написал вышеупомянутые строки, должен будет изменить вторую строку на эту:
a.setPhone("001-555-12345");
Таким образом, вы не можете просто добавить проверки, не нарушая другой код (он больше не будет компилироваться).
Кроме того, если вы обращаетесь ко всем полям / свойствам класса с помощью методов, вы поддерживаете постоянный доступ, и пользователю не нужно беспокоиться о том, сохранено ли свойство (т. Е. Является ли оно полем экземпляра) или вычислено (существуют только методы и нет экземпляров полей).