Абстракция в Java

В Java абстракция захватывает только те детали о классе, которые имеют отношение к текущему контексту. Например, java.util.Map хранит пары ключ-значение и предоставляет два метода get() и put() для хранения и извлечения пар ключ-значение. Это, по сути, единственная информация, которая нам нужна, если мы хотим использовать Map в приложении. Нам не обязательно знать, как Map работает внутри, чтобы использовать его. Это во многом пример абстракции в Java.

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

1. Абстракция в ООП?

В теории объектно-ориентированного программирования абстракция подразумевает определение объектов, представляющих абстрактных «акторов», которые могут выполнять работу, сообщать о своем состоянии и изменять его, а также «общаться» с другими объектами в системе.

Абстракция в любом языке программирования работает многими способами. Это можно увидеть от создания подпрограмм до определения интерфейсов для выполнения вызовов языка низкого уровня.

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

2. Виды абстракции

Обычно абстракцию можно рассматривать двумя способами:

  • Абстракция данных
  • Абстракция управления

2.1. Абстракция данных

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

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

2.2 Управление абстракцией

Любое программное обеспечение состоит из многочисленных операторов, написанных на любом языке программирования. Большую часть времени операторы похожи и повторяются в разных местах по несколько раз.

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

3. Как достичь абстракции в Java?

Поскольку абстракция является одним из основных принципов объектно-ориентированного программирования, а Java следует всем принципам ООП, абстракция является одним из основных строительных блоков языка Java.

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

  • Абстракция данных охватывает как создание простых объектов данных, так и сложные реализации коллекций, такие как HashMap или HashSet.
  • Аналогично, абстракцию управления можно увидеть на примере определения простых вызовов функций для создания полноценных фреймворков с открытым исходным кодом. Абстракция управления является основной движущей силой структурного программирования.

3.1 Абстракция с использованием интерфейсов

Давайте рассмотрим еще один пример абстракции в Java с использованием интерфейсов. В этом примере я создаю различные отчеты, которые могут быть запущены по требованию в любое время в течение жизненного цикла приложения. Как потребитель отчета, класс не должен знать внутренности run() отчета, он должен только выполнить этот метод, и отчет будет выполнен.

public interface Report {List<Object> run(ReportContext reportContext);}
public class ReportContext {//fields}
public class EmployeeReport implements Report {@Overridepublic List<Object> run(ReportContext reportContext) {//Custom LogicSystem.out.println("Executing employee report");return null;}}
public class SalaryReport implements Report {@Overridepublic List<Object> run(ReportContext reportContext) {//Custom logicSystem.out.println("Executing salary report");return null;}}

Теперь выполните отчеты с помощью метода run().

public class Main {public static void main(String[] args) {ReportContext reportContext = new ReportContext();//Populate contextReport eReport = new EmployeeReport();eReport.run(reportContext);Report sReport = new SalaryReport();sReport.run(reportContext);}}

Вывод программы.

Executing employee reportExecuting salary report

4. Разница между инкапсуляцией и абстракцией

Инкапсуляция — это реализация желаемой абстракции.

Абстракция больше касается сокрытия деталей реализации. В Java абстракция достигается посредством абстрактных классов и интерфейсов.

Инкапсуляция заключается в том, чтобы обернуть реализацию(код) и данные, которыми он манипулирует(переменные), в один и тот же класс. Класс Java, где все переменные экземпляра являются закрытыми, и только методы внутри класса могут манипулировать этими переменными, является примером инкапсулированного класса.

Если вы хотите узнать больше об абстрактных классах и интерфейсах в Java, прочтите мою следующую публикацию «Изучение интерфейсов и абстрактных классов в Java».

Прокрутить вверх