GrabDuck

Cybern.ru » Java. Урок 22. Модификаторы доступа

:

В данном уроке мы рассмотрим модификаторы доступа и поговорим о том, когда следует применять их. Для чего нужны модификаторы видимости? Они нужны для того, чтобы разграничивать методы и поля на те, которые может использовать программист в определенных ситуациях и на которые не может. Существуют четыре модификатора:

  • private
  • protected
  • internal
  • public

private

Самый жесткий модификатор доступа — private. Он разрешает доступ к членам класса только из этого класса:

public class User {
private int age;//поле с модификатором private

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

Как вы могли заметить я создал две функции get и set, которые свободно могут обращаться к полю age. Теперь через них можно получить и задать значение переменной. Такой подход достаточно популярен при разработке программ, так как вы в этих функциях можете контролировать диапазон присваиваемых значений и корректно вернуть значение, в случае, если оно у вас явно не хранится или если оно не правильно проинициализированно:

public class User {
private int age;//поле

public int getAge() {
return (age>0)? age : 0;//если возраст больше 0, то возвращаем его, иначе возвращаем ноль
}

public void setAge(int age) {
this.age = (age>0)? age : 0;//если устанавливаемый возраст больше 0, то присваиваем его в переменную
}
}

В данном примере, я проверяю возраст пользователя перед тем как присвоить или перед тем как вернуть значение. С таким же успехом сюда можно было добавить какую — нить проверку на null.
Рассмотрим примеры использования класса:

User user = new User();
user.age = 18;//ошибка доступа
user.setAge(-128);
int age = user.getAge();

Если бы мы не обрабатывали значение поля age в get и set, то мы получили отрицательный возраст, который мог бы привести к неправильной работе программы. Так как age имеет модификатор видимости private, то мы не можем явно установить значение перемение или получить ее значение.
Использование get-теров и set-ов желательно при создании переменных в классе, так как это единственный способ доступа к переменным private, то в среде существует способ создания их автоматически. Для этого необходимо нажать alt+insert как и в случае c конструкторами просто выбрать для каких переменных вы хотите создать get и set методы.

protected

Данный модификатор доступа разрешает использовать переменные в классах наследниках.
Допустим у нас есть тот же класс пользователь:

public class User {
protected int age;
}

И мы хотим, чтобы класс Student, который является наследником класса User, умел возвращать номер группы на основе возраста:

public class Student extends User{
public int getGroup(){
return (age - 18) * 100;
}
}

Очевидно, что модификатор доступа protected является более слабым, чем private, поэтому все возможности private присутствуют и у него.

internal (default)


Данный модификатор видимости используется как модификатор доступа по умолчанию:
public class User {
int age;
}

С помощью него можно осуществлять доступ внутри одного пакета. Пакет — это некоторый аналог папки в Java. По умолчанию все классы, которые вы создаете находятся в пакете по умолчанию, поэтому вы имеете доступ к переменным типа internal без проблем. Более подробно о пакетах мы поговорим в следующих уроках.

public

Самый приятный модификатор доступа. Он позволяет иметь доступ откуда угодно. Поэтому методы get и set и прочие функции, которые должен вызывать пользователь объекта делают public. Функции, которые должны быть использованы только как вспомогательные для класса и все поля делают private, кроме некоторых случаев, когда их делают protected.