Разбираем новые функции 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.
- Усовершенствованный сборщик мусора G1.Java 17 поставляется с улучшенным сборщиком мусора G1, который обеспечивает лучшую масштабируемость и сокращает время простоя. Усовершенствованный сборщик G1 использует новый алгоритм для размещения объектов в куче Java, что приводит к повышению производительности и уменьшению фрагментации памяти.
- Z Garbage Collector (ZGC):Z Garbage Collector(ZGC) — это еще один сборщик мусора, представленный в Java 17, который предлагает очень малое время паузы. ZGC предназначен для больших куч и поддерживает кучи размером от нескольких сотен мегабайт до нескольких терабайт. Он использует параллельный алгоритм, который выполняет большую часть своей работы одновременно с потоками приложения.
- Сборщик мусора 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