Статьи

Оберните вокруг шаблона дизайна в java8

Шаблон обтекания не указан в книге GOF, но очень полезен для решения проблем, подобных приведенным ниже:

  • Циклическая конструкция, например, для цикла do while / while / for
  • Секундомер вокруг некоторого кода.
  • Обернуть проверенное исключение с исключением во время выполнения
  • Инициализация и очистка, например, создание / уничтожение Threadpool или открытие / закрытие файла и т. Д.
  • Добавление контекстной информации в потоки, например, запрос контекстной информации для регистрации или передачи контекста безопасности и т. Д.

Для выполнения таких простых вещей в Java требуется много кода. Java8 добавил поддержку lamdba, и у этого есть ответ для таких проблем.

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

Обернуть вокруг

Шаблон функции обтекания выглядит примерно так

  • Предварительный код
  • Фактическое поведение
  • Почтовый индекс

WrapAround для цикла

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
@FunctionalInterface
    public interface CodeBlock {
        void execute();
    }
 
    @FunctionalInterface
    public interface Condition {
        boolean test();
    }
 
    public static void loop(Condition condition, CodeBlock codeBlock) {
        while (condition.test()) {
            codeBlock.execute();
        }
    }

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

Это позволяет нам вводить новую конструкцию.

Давайте посмотрим на еще один пример

WrapAround для времени / секундомер

01
02
03
04
05
06
07
08
09
10
11
@FunctionalInterface
    public interface CodeBlock {
        void execute();
    }
     
     public static void time(String name, CodeBlock codeBlock) {
        long start = System.currentTimeMillis();
        codeBlock.execute();
        long total = System.currentTimeMillis() - start;
        System.out.println(name + " took " + total + " ms");
    }

WrapAround Closable / Исключение

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@FunctionalInterface
    public interface AutoCodeBlock {
        void execute(AutoCloseable closeable) throws IOException;
    }
 
    @FunctionalInterface
    public interface ExceptionBlock {
        void execute() throws Exception;
    }
     
    public static void withAutoClose(AutoCloseable resource, AutoCodeBlock codeBlock) throws Exception {
        try (AutoCloseable c = resource) {
            codeBlock.execute(c);
        }
    }
 
    public static void wrapWithRuntimeException(ExceptionBlock codeBlock) {
        try {
            codeBlock.execute();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

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

  • Код, используемый в блоге доступен @ github
Ссылка: Оберните вокруг шаблон дизайна в java8 от нашего партнера JCG Ашкрит Шарма в блоге Готовы .