Разбираем новые функции Java 17

(Примечание: хотя Java 17 была выпущена еще в сентябре 2021 года, она по-прежнему считается одним из наиболее широко используемых языков программирования. Несмотря на то, что с момента выпуска Java 17 прошло некоторое время, она по-прежнему актуальна и важна, чтобы оставаться быть в курсе последних достижений в области языков программирования.)

Готовы ли вы поднять свои навыки программирования на Java на новый уровень?

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

Долгожданная версия Java 17 полна интересных функций и улучшений, которые поразят вас!

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

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

Вы не поверите, как легко писать код на Java 17!

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

Попрощайтесь со сложным и трудным для чтения кодом и поприветствуйте чистый, лаконичный и выразительный код, который сделает ваше программирование проще простого!

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

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

И так, чего же ты ждешь?

Будьте готовы вывести свои навыки программирования на новый уровень с Java 17!

1. Запечатанные классы и интерфейсы

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

«В объектно-ориентированном программировании абстракция — это мощный инструмент, позволяющий моделировать объекты реального мира как программные объекты. Однако у абстракции есть и недостаток: она может внести двусмысленность в ваш код, если ее использовать неаккуратно.

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

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

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

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

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

i — Пример:

Допустим, у вас есть абстрактный класс с именем Shape, и вы хотите определить набор подклассов, которые можно использовать в вашем коде:

public abstract class Shape {
   public abstract double getArea();
}

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

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

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

Вот пример того, как это сделать для Shape:

public abstract sealed class Shape permits Circle, Rectangle {
   public abstract double getArea();
}

public final class Circle extends Shape {
   private final double radius;
   public Circle(double radius) {
      this.radius = radius;
   }
   public double getArea() {
      return Math.PI * radius * radius;
   }
}

public final class Rectangle extends Shape {
   private final double width;
   private final double height;
   public Rectangle(double width, double height) {
      this.width = width;
      this.height = height;
   }
   public double getArea() {
      return width * height;
   }
}

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

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

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

ii — Таблица:

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

2. Сопоставление шаблонов для операторов switch

Сопоставление шаблонов для операторов switch — это новая функция, представленная в Java 17, которая позволяет использовать шаблоны в операторах switch. Эта функция упрощает синтаксис операторов switch и делает их более выразительными.

До Java 17 операторы switch позволяли использовать только примитивные типы и перечисления в качестве меток case. Это означало, что разработчикам приходилось использовать операторы if-else или создавать сложную иерархию вложенных операторов switch для достижения более сложной логики.

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

i — Пример:

Например, рассмотрим следующий фрагмент кода:

String str = "hello";

switch (str) {
    case "hello" -> System.out.println("Hello!");
    case "world" -> System.out.println("World!");
    case String s && s.length() > 0 -> System.out.println("String with length > 0!");
    default -> System.out.println("Default case");
}

В этом примере оператор switch использует сопоставление с образцом для сопоставления с объектом String. Первые два случая соответствуют строковым литералам «hello» и «world». В третьем случае используется шаблон, который соответствует любому ненулевому объекту String с длиной больше 0. Случай по умолчанию выполняется, если ни один из других случаев не соответствует.

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

Кроме того, сопоставление шаблонов для операторов switch обратно совместимо, а это означает, что код, написанный в более старых версиях Java, по-прежнему будет правильно работать в Java 17.

Сопоставление шаблонов для операторов switch — это новая мощная функция в Java 17, которая упрощает синтаксис операторов switch и позволяет создавать более выразительный код. Его обратная совместимость также гарантирует, что разработчики могут использовать эту функцию, не опасаясь сломать существующий код.

ii — Таблица:

Вот таблица, обобщающая изменения, включенные в Java 17 для сопоставления шаблонов с операторами switch:

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

3. Текстовые блоки

Текстовые блоки — одна из самых интересных функций, представленных в Java 17. Она позволяет разработчикам писать многострочные строки без использования escape-последовательностей или конкатенации. Мы рассмотрим, что такое текстовые блоки, почему они важны и как их использовать в Java 17.

i — Что такое текстовые блоки в Java 17?

Текстовые блоки — это новая функция, представленная в Java 17, которая обеспечивает более естественный способ представления многострочных строк в коде Java. Они заключаются в тройные кавычки ("""), а в результирующей строке сохраняются разрывы строк и пробелы. Цель текстовых блоков — упростить написание строк, занимающих несколько строк кода, и улучшить читаемость кода.

ii — Почему текстовые блоки важны в Java 17?

До введения текстовых блоков разработчикам Java приходилось использовать управляющие последовательности или объединять несколько строк для записи многострочных строк. Это было не только громоздко, но и делало код менее читаемым. Текстовые блоки решают эту проблему, позволяя разработчикам писать многострочные строки более естественным образом, что упрощает чтение и обслуживание кода.

iii — Как использовать текстовые блоки в Java 17?

Чтобы использовать текстовые блоки в Java 17, заключите строку в тройные кавычки (""").

Вот пример:

String textBlock = """
                   This is a text block
                   that spans multiple lines.
                   """;

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

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

Например:

String textBlock = """
                   This is a text block
                   that includes a \t tab character.
                   """;

В приведенном выше примере управляющая последовательность \t используется для включения в строку символа табуляции.

iv — Текстовые блоки в Java 17 по сравнению с предыдущими версиями Java

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

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

Вот таблица, в которой суммированы различия между текстовыми блоками в Java 17 и предыдущих версиях Java:

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

4. Усовершенствованные генераторы псевдослучайных чисел

Java 17 вносит улучшения в существующие генераторы псевдослучайных чисел (PRNG) в виде новых интерфейсов и реализаций.

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

Одним из новых интерфейсов, представленных в Java 17, является интерфейс UniformRandomProvider.

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

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

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

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

i — Пример:

Вот пример того, как использовать интерфейс UniformRandomProvider для генерации случайных целых чисел и удвоений с различными распределениями:

import org.apache.commons.math3.random.RandomGeneratorFactory;
import org.apache.commons.math3.random.UniformRandomProvider;
import org.apache.commons.math3.distribution.NormalDistribution;

public class RandomExample {
    public static void main(String[] args) {
        UniformRandomProvider rng = RandomGeneratorFactory.createRandomGenerator();
        
        // Generate a random integer between 1 and 6
        int diceRoll = rng.nextInt(6) + 1;
        System.out.println("Dice roll: " + diceRoll);
        
        // Generate a random double with a normal distribution
        NormalDistribution normal = new NormalDistribution(rng, 0, 1);
        double randomValue = normal.sample();
        System.out.println("Random value: " + randomValue);
    }
}

ii — Таблица:

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

Вот сравнительная таблица новых функций Java 17 по сравнению с предыдущими версиями Java:

Усовершенствования генераторов псевдослучайных чисел в Java 17 упрощают разработчикам создание высококачественных случайных чисел с большей гибкостью и производительностью.

Добавление новых интерфейсов и реализаций, а также новых методов распространения и параметров ГПСЧ делает его ценным обновлением для разработчиков, которые полагаются на ГПСЧ в своих приложениях.

5. Улучшен сбор мусора

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

Java 17 поставляется с улучшенным алгоритмом сборки мусора, который повышает производительность Виртуальной машины Java (JVM) за счет сокращения времени паузы приложения и улучшения его масштабируемости.

В этом разделе мы обсудим улучшения в сборке мусора в Java 17.

  1. Усовершенствованный сборщик мусора G1.Java 17 поставляется с улучшенным сборщиком мусора G1, который обеспечивает лучшую масштабируемость и сокращает время простоя. Усовершенствованный сборщик G1 использует новый алгоритм для размещения объектов в куче Java, что приводит к повышению производительности и уменьшению фрагментации памяти.
  2. Z Garbage Collector (ZGC):Z Garbage Collector(ZGC) — это еще один сборщик мусора, представленный в Java 17, который предлагает очень малое время паузы. ZGC предназначен для больших куч и поддерживает кучи размером от нескольких сотен мегабайт до нескольких терабайт. Он использует параллельный алгоритм, который выполняет большую часть своей работы одновременно с потоками приложения.
  3. Сборщик мусора Shenandoah. Сборщик мусора Shenandoah — это экспериментальный сборщик мусора на Java 17, ориентированный на операции с малым временем паузы. Он работает, выполняя большую часть своей работы одновременно с потоками приложения, что приводит к минимальному времени паузы.

i — Пример:

Чтобы продемонстрировать улучшения производительности сборщиков мусора в Java 17, давайте рассмотрим следующий пример:

import java.util.ArrayList;

public class GarbageCollectionExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < 1000000; i++) {
            list.add("Object " + i);
        }
    }
}

Этот код создает большой список строк, что обычно приводит к значительным паузам во время сборки мусора. Однако с улучшенными сборщиками мусора в Java 17 время паузы значительно сокращается, что приводит к повышению производительности.

ii — Сравнительная таблица:

Как видно из таблицы выше, в Java 17 представлены два новых сборщика мусора, ZGC и Shenandoah, которых не было в предыдущих версиях. Эти новые сборщики значительно улучшают производительность и время паузы для больших куч. Кроме того, улучшенный коллектор G1 также обеспечивает лучшую масштабируемость и сокращение времени паузы.

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

Заключение

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

Например, в Java 17 также представлена ​​новая языковая функция под названием «записи», которая обеспечивает краткий синтаксис для создания классов, которые в основном используются для хранения данных. Эта функция может упростить код и улучшить его читаемость.

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

Java 17 также представляет несколько улучшений производительности, в том числе улучшенное время запуска и более быстрое выполнение приложений. Эти улучшения могут улучшить взаимодействие с пользователем и повысить производительность разработчиков.

📖 Изучите Java с нуля и станьте волшебником программирования благодаря моему курсу для начинающих! Начните свое путешествие по программированию сегодня и раскройте свой потенциал:



Подпишитесь на DDIntel Здесь.

Посетите наш сайт здесь: https://www.datadriveninvestor.com

Присоединяйтесь к нашей сети здесь: https://datadriveninvestor.com/collaborate