Рубрики
Без рубрики

Вы серьезно еще не используете Java 15?

Экспериментировать с новейшими и лучшими функциями Java 15 – это очень весело! Но насколько возможно его использование в вашем существующем Java-проекте?. Помечено java, java 15, amazoncorretto, maven.

  • Чего я хочу достичь : Я хочу переехать в Амазонка Корретто 15 так что я могу использовать новые функции в своих рабочих проектах. Эти функции кажутся долгожданными; Настолько, Котлин и Ломбок продолжают набирать популярность.
  • Как : Я планирую преобразовать существующий проект Java из amazon‑corretto‑11 в amazon‑corretto‑15, и добавить в проект код, который будет использовать новые функции, просто чтобы посмотреть, как наша инфраструктура их обрабатывает.
  • Предостережения : Эта конкретная услуга закреплена в доке. Поэтому нам также потребуется обновить наш образ docker для использования Java 15. Я планирую запустить проект за пределами docker, просто используя mvn из локальной оболочки.

Измените версию плагина компилятора Maven.

В разделе “Сборка” pom.xml файл:

    
        
            . . .
            
                maven-compiler-plugin
                3.8.1
                
                    15
                    
                        --enable-preview
                    
                
            
            . . .
            
                org.apache.maven.plugins
                maven-surefire-plugin
                
                    0
                    --enable-preview
                
            
            . . .
            
                org.apache.maven.plugins
                maven-failsafe-plugin
                
                    --enable-preview
                
            
        
    

Мне нужно было Количество разветвлений в надежный конфигурация плагина потому что родительский pom объявляет что-то более высокое, чем 0 , НАДЕЖНЫЙ-1528 .

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

Установка Amazon Corretto 15

Скачать amazon-правильно-15

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

Обновление моей среды разработки

Интеллект

Загрузите последнюю версию IntelliJ и вы будете полностью готовы к использованию Java 15 начиная с версии 2020.2 !

Затмение

Загрузите последнюю версию Eclipse

Использование JDK

Просто убедитесь, что при настройке вашей ИДЕИ вы указываете на правильную установку to JDK!

Здесь больше нет необходимости в ломбоке | Записи

Вот простой класс в существующем проекте. Пользователям в этом домене предоставляется “маленький шаг” между 0 и 7 .

С Ломбоком:

@lombok.Data
public class UserBabyStep {
  public static final UserBabyStep NO_BABY_STEP = new UserBabyStep();

  public static final int DEFAULT_BABY_STEP = 0;
  public static final int MAX_BABY_STEP = 7;

  private final int value;

  public UserBabyStep() {
    this.value = DEFAULT_BABY_STEP;
  }

  public UserBabyStep(final int value) {
    if (value < 0 || value > MAX_BABY_STEP)
      throw new IllegalArgumentException(
          "The Baby Step of a user must be between 0 and 7 inclusively.");
    this.value = value;
  }
}

Привет записи !

public record UserBabyStep(int value) {
  public static final UserBabyStep NO_BABY_STEP = new UserBabyStep();

  public static final int DEFAULT_BABY_STEP = 0;
  public static final int MAX_BABY_STEP = 7;

  public UserBabyStep() {
    this(DEFAULT_BABY_STEP);
  }

  public UserBabyStep(final int value) {
    if (value < 0 || value > MAX_BABY_STEP)
      throw new IllegalArgumentException(
          "The Baby Step of a user must be between 0 and 7 inclusively.");
    this.value = value;
  }
}

Примечания для записи

Ломбок создаст более Java‑канонический метод получения для полей: GetValue() . Метод получения, созданный функцией запись , выглядит следующим образом: значение() . Это больше похоже на то, как Неизменяемая библиотека работает и является необычным способом обойти, когда вы можете или не хотите isFlag для логического добытчики. Особенно, если вы похожи на меня и предпочитаете использовать систему типов для упаковки примитивов в более управляемый доменом класс.

Еще одно замечание заключается в том, что запись ‑объявленные классы не могут расширять другой класс! Реализуйте только интерфейсы.

Необходимое использование канонического конструктора

Наконец, при использовании записей все конструкторы должны вызывать канонический конструктор. То есть конструктор с теми же типами, порядком и количеством аргументов, которые объявлены в самой записи.

Кто хочет поиграть в шашки?

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

Также я выделил код проверки если вы хотите взглянуть поближе.

Герметичные Интерфейсы

Однако я собираюсь разобраться с этим здесь, см. Примечание в конце статьи, касающееся закрытых интерфейсов.

Шахматная доска, как правило, имеет два чередующихся цвета, покрывающих доску размером 8 х 8.

Каждая пробел /плитка может содержать содержимое ; красный или черный маркер.

Чтобы продемонстрировать разницу между отдельными плитками, существует закрытый интерфейс, называемый Пробел , который позволяет a Черное пространство и Красное пространство . Затем каждый подкласс также реализует метод wither , который позволяет пространству принимать новое содержимое.

public enum Contents {
  EMPTY, BLACK, RED;
}

public static sealed interface Space permits BlackSpace, RedSpace {
  public Contents contents();
  public int x();
  public int y();
  public Space withContents(final Contents state);

  public default boolean isEmpty() {
    return contents() == Contents.EMPTY;
  }

  public default boolean contains(final Contents state) {
    return contents() == state;
  }

  public record BlackSpace(Contents contents, int x, int y) implements Space {
    public BlackSpace(final int x, final int y) {
      this(Contents.EMPTY, x, y);
    }

    @Override
    public Space withContents(final Contents contents) {
      return new BlackSpace(contents, x, y);
    }
  }

  public record RedSpace(Contents contents, int x, int y) implements Space {
    public RedSpace(final int x, final int y) {
      this(Contents.EMPTY, x, y);
    }

    @Override
    public Space withContents(final Contents contents) {
      return new RedSpace(contents, x, y);
    }
  }
}

Теперь наша Шахматная доска может выглядеть примерно так:

@SuppressWarnings("preview")
public class CheckerBoard {
  private static int MAX = 8;
  private final Space[][] spaces;

  private CheckerBoard() {
    spaces = new Space[MAX][MAX];
    forEachSpace(
        (i, j) -> spaces[i][j] =
          ((i + j) % 2 == 0)
            ? new BlackSpace(i, j)
            : new RedSpace(i, j));
  }

  . . .

}

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

Многострочные строки

Java устраняет все начальные пробелы между символами новой строки! К счастью, у меня уже был сценарий, в котором мне в любом случае не понадобились бы начальные пробелы в моей строке:

class CheckerBoardTest {
  @Test
  void shouldPrintBoardAsExpected() {
    final CheckerBoard subject = CheckerBoard.freshBoardWithTokens();

    assertThat(subject.toString())
      .isEqualTo("""
            Ω · Ω · Ω · Ω ·
            ᠽ ᠽ ᠽ ᠽ
            Ω · Ω · Ω · Ω ·
            ᠥ ᠥ ᠥ ᠥ
            • · • · • · • ·
            · ☺ · ☺ · ☺ · ☺
            ☺ · ☺ · ☺ · ☺ ·
            · ☺ · ☺ · ☺ · ☺
            """);
  }
}

Спецификация формата Google в принципе понятия не имеет, что с этим делать…

Сопоставление с образцом в экземпляре (приведение экземпляра)

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

Это также напоминает функцию библиотеки тестирования AssertJ .

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

Поэтому вместо:

public void method(final Animal animal) {
  if (animal instanceof Cat) {
    ((Cat) animal).meow();
  }
}

Мы можем сделать:

public void method(final Animal animal) {
  if (animal instanceof Cat cat) {
    cat.meow();
  }
}

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

public static CheckerBoard freshBoardWithTokens() {
  final CheckerBoard board = new CheckerBoard();

  board.forTopThreeRowsOfSpaces(space -> {
    if (space instanceof BlackSpace s) {
      board.spaces[s.x()][s.y()] = s.withContents(BLACK);
    }
  });

  board.forBottomThreeRowsOfSpaces(space -> {
    if (space instanceof BlackSpace s) {
      board.spaces[s.x()][s.y()] = s.withContents(RED);
    }
  });

  return board;
}

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

Переключить Выражение

Наш класс Шахматная доска имеет удобный метод toString для удобного визуального:

@Override
public String toString() {
  return streamSpaces()
    .map(space -> {
      final String strSpace = (switch (space.contents()) {
        case EMPTY:
          yield space instanceof RedSpace? "·" : "•";
        case BLACK:
          yield "Ω";
        case RED:
          yield "☺";
      });

      return String.format(
          "%s%s",
          strSpace,
          space.isRightEdge()
            ? "\n"
            : " ");
    })
    .reduce(new StringBuilder(), StringBuilder::append, (l, r) -> l)
    .toString();
}

Это новое ключевое слово доходность на работе! Я могу по существу перебирать каждый пробел , чтобы получить символ.

Дополнительные примеры можно найти здесь, в этой статье Baeldung .

  • форматировщик кода Google ломается. Похоже, что он разбивается на записи, многострочные строки и ключевое слово yield , которое встречается в выражениях switch

    • Чтобы решить эту проблему, я думаю, что какой-нибудь мотивированный человек мог бы просто начать сотрудничать с репозиториями Google GitHub для этого. Специальное репо Хранилище конфигурации
  • компилятору maven (на самом деле, JVM) требуется флаг --enable-предварительный просмотр для разблокировки функций. Это очевидный красный флаг для использования в производственном коде. Также трудно оценить риск использования этих функций. В прошлом многие функции JDK, которые поставлялись в виде предварительных просмотров в более ранних версиях Java, фактически функционировали идеально. Будет ли так продолжаться и дальше?

Нельзя просто предположить, что предварительный просмотр Функция Java будет интегрирована в JDK в долгосрочной перспективе. В JavaDoc для Записи класса даже содержится отказ от ответственности:

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

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

Что касается других функций, описанных в этой статье:

Сопоставление с образцом в случае 16 14
Записи 16 14
Многострочные строки 14 13
Переключать Выражения 14 12
Герметичные интерфейсы ? 15

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

Другие функции, которые я перечислил как интегрированные для версии 16, синтаксически не изменились с 15 (насколько я мог судить). Так что с этим ты в полной безопасности

Вердикт

Если вы какое-то время не хотите использовать плагин форматирования кода Google и пока не хотите использовать закрытые интерфейсы, вы и ваша команда можете выполнить обновление!

Если по какой-то причине у вас все еще есть соблазн использовать запечатанные интерфейсы в любом случае, я бы настоятельно рекомендовал не использовать их! Это не является официально интегрированной функцией и может измениться или даже исчезнуть. Хорошим примером этого была функция “Переключение выражений”. Он был введен в версии 12 и перегружен ключевым словом break . Это было изменено на выход в версии 13, чтобы сделать более понятным предполагаемое поведение. Поскольку он изменился, он, естественно, должен был оставаться в предварительном просмотре в версии 13, а затем, наконец, был принят в версии 14. Неизвестно, какую итерацию все еще могут пройти запечатанные интерфейсы.

Иногда полезно объявить Функцию в Java-лямбде, но вы планируете возвращать определенный объект независимо от ввода. В прошлом я использовал подчеркивание _ для определения переменной, не представляющей интереса. Java 9 прекратила это было запрещено. Что мне показалось интересным, учитывая, что введение _ в качестве имени переменной имело очевидное намерение использоваться в лямбдах для неиспользуемых аргументов .

В то время как в наших кодовых базах мы теперь перешли на использование двойных подчеркиваний __ для этого мы также используем Var. Так что хорошей альтернативой может быть использование Функция 1.постоянная .

Оригинал: “https://dev.to/aaiezza/are-you-seriously-not-using-java-15-yet-5c86”