Переменные экземпляра делаются закрытыми, чтобы заставить пользователей этого класса использовать методы для доступа к ним. В большинстве случаев есть простые геттеры и сеттеры, но могут использоваться и другие методы.
Использование методов позволит вам, например, ограничить доступ только для чтения, т. е. поле может быть прочитано, но не записано, если нет установщика. Это было бы невозможно, если бы поле было общедоступным.
Кроме того, вы можете добавить некоторые проверки или преобразования для доступа к полю, что было бы невозможно при обычном доступе к общедоступному полю. Если поле было общедоступным, и вы позже хотели бы принудительно получить доступ к нему с помощью какого-либо метода, который выполняет дополнительные проверки и т. д., вам придется изменить все способы использования этого поля. Если вы сделаете его приватным, вам просто нужно будет позже изменить методы доступа.
Если 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");
Таким образом, вы не могли просто добавить проверки, не нарушая остальной код (он больше не будет компилироваться).
Кроме того, если вы получаете доступ ко всем полям/свойствам класса с помощью методов, вы сохраняете доступ согласованным, и пользователю не придется беспокоиться о том, хранится ли свойство (т. е. поле экземпляра) или вычисляется (есть только методы и нет полей экземпляра). ).
person
Thomas
schedule
01.10.2011
setter
, вы можете проверитьnull
и бросить иIllegalArgumentException
, еслиnull
когда-либо будет передано. Однако, если полеpublic
, то любой пользователь вашего класса может установить для поля любое значение, включаяnull
. Тогда ваш код может получитьNullPointerException
, потому что он всегда ожидал, что поле никогда не будетnull
. - person John B   schedule 02.10.2011