Заполните форму и наш менеджер свяжется с вами
Java Generics: как с помощью него сделать код максимально эффективным

Java Generics: как с помощью него сделать код максимально эффективным

article
banner

Принцип PECS в Java используется при работе с generics для обозначения производителей (Producer) и потребителей (Consumer) элементов данных. В статье рассказываем, как это используется в разработке, и даем инструкцию, как с помощью инструмента повысить эффективность кода.

Подберите программу обучения, узнайте проходной балл и начните учиться бесплатно

Что такое принцип pecs в Java

Принцип PECS (Producer Extends, Consumer Super) – концепция, которая применяется в контексте дженериков (generics) и помогает распределить ключевые слова extends и super. Позволяет ограничивать использование типов данных в коллекциях. 

Producer Extends (производители) передают в метод только объекты, которые относятся к подклассу указанного типа, но не выше. Это означает, что метод может «производить» (возвращать) объекты этого типа или его подклассов. Например, если у нас есть класс Box, то мы можем передать в метод объект класса Apple или Orange, но не объект класса Fruit.

Consumer Super (потребители), напротив, получают объекты только суперкласса указанного типа, но не ниже. Например, если у нас есть класс Crate, то мы можем передать в метод объект класса Fruit или Object, но не объект класса Apple.

Коллекции с ключевым словом extends только предоставляют данные, а коллекции с super – принимают, но не отдают.

Какие проблемы решает

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

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

Как правильно применять в коде

Пошаговая инструкция:

  • Примените статический метод с модификатором доступа public, с ключевым словом static и возвращаемым типом void. Пример:
 public static void usePECS() { 
  • Используйте входной параметр с ограничением, указывающим на класс данных, который можно применить в методе. Пример:
  public static <T extends Number> void usePECS(List<T> list) {
  • Используйте методы и операции, не зависящие от конкретного типа при работе с коллекциями. 
public static void usePECS(List<?> list) {
  for (Object obj : list) {
    System.out.println(obj);
  }
}
  • Используйте wildcard-символ «?» для ограничения класса до «super» или «extends» для добавления или извлечения элементов из коллекции. 

public static void usePECS(List<? extends Number> list) {
    for (Number num : list) {
        System.out.println(num);
    }
}
  • Учитывайте, что при использовании PECS может происходить стирание типов (type erasure), поэтому необходимо бережно обращаться с видами данных. 
  • Используйте преобразование типов для избежания ошибок при стирании. 
public static void usePECS(List<?> list) {
  List<Integer> intList = (List<Integer>) list;
  intList.add(5); // Нет ошибки компиляции после преобразования типов
}

Типичные ошибки и как их избежать

  • Неправильное определение ограничений wildcard типов. Внимательно изучите документацию по PECS.
  • Неаккуратное использование generics. Требуется глубоко ознакомиться с синтаксисом.
  • Ошибки при type erasure. При работе с обобщенными коллекциями учитывайте принцип PECS. Если вы только считываете данные из коллекции (Consumer), используйте ограничение <? super T>. Если вы добавляете данные в коллекцию (Producer), используйте ограничение <? extends T>.
  • Предупреждение о небезопасном использовании типов (unchecked warning). Можно пропустить, но лучше исправить. Компилятор сигнализирует, что не сумел выявить степень безопасности указанных видов данных.

Как применить для повышения эффективности кода

Принцип PECS помогает улучшить эффективность кода в Java, особенно при работе с дженериками:

  • Рассмотрим следующий код:
public static void printList(List < ? > list) {
  for (Object item: list) {
    System.out.println(item);
  }
}
  • Этот код использует type erasure и не относится к типобезопасным. Его можно улучшить с помощью PECS:

Верхняя граница (Производитель):

public static <T> void printList(List<T> list) {
    for (T item : list) {
        System.out.println(item);
    }
}
  • В этом случае мы используем верхнюю границу для указания, что метод может принимать любые списки, содержащие элементы типа T или его подклассов.
  • Это гарантирует безопасный вывод элементов из списка.

Нижняя граница (Потребитель):

public static  void processList (List list) {
    for (T item: list) {
        // Здесь мы можем выполнять операции с элементами типа Number или его суперклассов
    }
}
  • В этом случае мы используем нижнюю границу, чтобы указать, что метод может принимать любые списки, содержащие элементы класса Number или его суперклассов.
  • Это гарантирует безопасность выполнения операций с элементами, так как в список включаются только числа или их производные.

Главное, что нужно знать

  1. Принцип PECS применяется при разработке кода в Java, при использовании дженериков. Суть в том, что при передаче параметров в методы, следует использовать подходящие wildcards: extends для producer (метод возвращает данные) и super для consumer (метод принимает данные).
  2. Концепция помогает обеспечить безопасность типов данных, предотвратить ошибки в системе, улучшить читаемость кода, избежать проблем при стирании типов.
  3. При работе с обобщенными коллекциями применяйте принцип PECS. Если вы считываете данные из коллекции, используйте ограничение <? super T>, если добавляете, то ограничение <? extends T>.

Адреса поступления

ЦФО
Москва, Ленинградский пр., д. 80Г
Сокол
+7 495 800–10–01 8 800 100–00–11
banner
Подберите программу обучения, узнайте проходной балл и начните учиться бесплатно
download
Всё самое важное — в личном кабинете абитуриента
Войти
школаколледжуниверситетбизнес-образованиекурсы
image
1000+программ
Образованиеhatдляhatкарьеры

В «Синергии» 1000+ образовательных программ

У нас есть решения для любого уровня, профессии и цели:
01Сформировать прочный фундамент знаний в&nbsp;школе
Сформировать прочный фундамент знаний в школе
02Получить качест&shy;венное среднее профессио&shy;нальное или&nbsp;высшее образование
Получить качест­венное среднее профессио­нальное или высшее образование
03Освоить новую специальность на&nbsp;<span style="white-space:nowrap;">онлайн-курсах</span>
Освоить новую специальность на онлайн-курсах
04Пройти результативную переподготовку или&nbsp;повысить квалификацию
Пройти результативную переподготовку или повысить квалификацию
05Достичь экспертного управленческого уровня с&nbsp;<span style="white-space:nowrap;">программой</span> MBA
Достичь экспертного управленческого уровня с программой MBA
Качество образования подтвержденомеждународными стандартами:
мы состоим в Европейском фонде гарантии качества электронного обучения и Великой хартии европейских университетов, участвуем в Международной ассоциации университетов при ЮНЕСКО
Подобрать программу обучения