Инкапсуляция в Java


В подходах объектно-ориентированного программирования инкапсуляция (англ.: Encapsulation) означает способ обертывания и сокрытия деталей реализации абстрактного функционального интерфейса.

Инкапсуляцию можно рассматривать как защитный барьер, который препятствует произвольному доступу к коду и данным класса со стороны кода, определяемого внешними классами.

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

Основная функция инкапсуляции заключается в том, что мы можем изменять собственный код реализации без необходимости изменять фрагменты программы, которые вызывают наш код.

Правильная инкапсуляция может сделать код более понятным и удобным для сопровождения, а также повышает безопасность кода.

Преимущества инкапсуляции

  • 1. Хорошая инкапсуляция может уменьшить связанность.

  • 2. Внутреннюю структуру класса можно свободно изменять.

  • 3. Переменными-членами можно управлять более точно.

  • 4. Скрыть информацию и детали реализации.


Шаги для достижения инкапсуляции в Java

1. Измените видимость атрибутов, чтобы ограничить доступ к атрибутам (обычно ограничивается private), например:

public class Person { private String name; private int age; }

В этом коде атрибутnameиageустановлен как private; только этот класс может получить к нему доступ, а другие классы не могут, тем самым скрывая информацию.

2. Для каждого атрибута значения предоставьте public-методы для внешнего доступа, то есть создайте пару методов-геттеров и сеттеров для доступа к private-атрибутам, например:

public class Person{ private String name; private int age; ​ public int getAge(){ return age; } ​ public String getName(){ return name; } ​ public void setAge(int age){ this.age = age; } ​ public void setName(String name){ this.name = name; } }

Использованиеthis: это ключевое слово используется для разрешения конфликта одинаковых имён между переменной экземпляра (private String name) и локальной переменной (переменная name в setName(String name)).


Пример

Рассмотрим пример класса с инкапсуляцией в Java:

Код файла EncapTest.java:

/*Имя файла: EncapTest.java*/ public class EncapTest{ private String name; private String idNum; private int age; public int getAge(){ return age; } public String getName(){ return name; } public String getIdNum(){ return idNum; } public void setAge( int newAge){ age = newAge; } public void setName(String newName){ name = newName; } public void setIdNum( String newId){ idNum = newId; } }

В приведенном выше примере public-методы являются точкой входа для внешних классов для доступа к переменным-членам класса.

Обычно такие методы называются getter- и setter-методами.

Следовательно, любой класс, который хочет получить доступ к private переменным-членам класса, должен использовать эти getter- и setter-методы.

В следующем примере показано, как осуществляется доступ к переменным класса EncapTest:

Код файла RunEncap.java:

/*Имя файла: RunEncap.java*/ public class RunEncap{ public static void main(String args[]){ EncapTest encap = new EncapTest(); encap.setName("James"); encap.setAge(20); encap.setIdNum("12343ms"); System.out.print("Имя : " + encap.getName()+ " Возраст : "+ encap.getAge()); } }

Результат компиляции и выполнения приведенного выше кода выглядит следующим образом:

Name : James Age : 20
Другие расширения