Java 13 Функции

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

Функции Java 13

Некоторые из важных функций Java 13:

  • Блоки текста – JEP 355
  • Новые методы в классе String для блоков текста
  • Улучшения в выражениях Switch – JEP 354
  • Переосуществление унаследованного API сокетов – JEP 353
  • Динамический архив CDS – JEP 350
  • ZGC: Отмена неиспользуемой памяти – JEP 351
  • Метод FileSystems.newFileSystem()
  • Поддержка Unicode 12.1
  • Фабрики DOM и SAX с поддержкой пространств имен

Как включить функции предварительного просмотра

Выражения Switch и блоки текста являются функциями предварительного просмотра. Поэтому вам нужно включить настройки предварительного просмотра в вашем проекте. Если вы запускаете программу на Java из командной строки, вы можете включить ее с помощью переключателя --enable-preview. Вы можете использовать этот переключатель для запуска JShell с включенными функциями предварительного просмотра.

$ jshell --enable-preview

$ java --enable-preview --source 13 Test.java

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

Eclipse Enable Preview Features

1. Блоки текста – JEP 355

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

package com.journaldev.java13.examples;

public class TextBlockString {

	/**
	 * JEP 355: Preview Feature
	 */
	@SuppressWarnings("preview")
	public static void main(String[] args) {
		String textBlock = """
				Hi
				Hello
				Yes""";

		String str = "Hi\nHello\nYes";

		System.out.println("Text Block String:\n" + textBlock);
		System.out.println("Normal String Literal:\n" + str);

		System.out.println("Text Block and String Literal equals() Comparison: " + (textBlock.equals(str)));
		System.out.println("Text Block and String Literal == Comparison: " + (textBlock == str));
	}

}

Выход:

Text Block String:
Hi
Hello
Yes
Normal String Literal:
Hi
Hello
Yes
Text Block and String Literal equals() Comparison: true
Text Block and String Literal == Comparison: true

Это полезно для легкого создания строк HTML и JSON в нашей программе Java.

String textBlockHTML = """
		<html>
		<head>
			<link href='/css/style.css' rel='stylesheet' />
		</head>
		<body>
                        <h1>Hello World</h1>
                </body>
                </html>""";

String textBlockJSON = """
		{
			"name":"Pankaj",
			"website":"JournalDev"
		}""";

2. Новые методы в классе String для блоков текста

В классе String появились три новых метода, связанных с функцией блоков текста.

  1. formatted(Object… args): он похож на метод format() строки. Он добавлен для поддержки форматирования с использованием блоков текста.
  2. stripIndent(): используется для удаления случайных символов пробела с начала и конца каждой строки в блоке текста. Этот метод используется блоками текста и сохраняет относительный отступ содержимого.
  3. translateEscapes(): возвращает строку, значение которой является этой строкой, с экранированными последовательностями, как в строковом литерале.
package com.journaldev.java13.examples;

public class StringNewMethods {

	/***
	 * New methods are to be used with Text Block Strings
	 * @param args
	 */
	@SuppressWarnings("preview")
	public static void main(String[] args) {
		
		String output = """
			    Name: %s
			    Phone: %d
			    Salary: $%.2f
			    """.formatted("Pankaj", 123456789, 2000.5555);
		
		System.out.println(output);
		
		
		String htmlTextBlock = "<html>   \n"+
				                    "\t<body>\t\t \n"+
				                        "\t\t<p>Hello</p>  \t \n"+
				                    "\t</body> \n"+
				                "</html>";
		System.out.println(htmlTextBlock.replace(" ", "*"));
		System.out.println(htmlTextBlock.stripIndent().replace(" ", "*"));
		
		String str1 = "Hi\t\nHello' \" /u0022 Pankaj\r";
		System.out.println(str1);
		System.out.println(str1.translateEscapes());
		
	}

}

Вывод:

Name: Pankaj
Phone: 123456789
Salary: $2000.56

<html>***
	<body>		*
		<p>Hello</p>**	*
	</body>*
</html>
<html>
	<body>
		<p>Hello</p>
	</body>
</html>
Hi	
Hello' " /u0022 Pankaj
Hi	
Hello' " /u0022 Pankaj

3. Улучшения в выражениях Switch – JEP 354

Выражения Switch были добавлены как функция предварительного просмотра в релизе Java 12. Они почти такие же в Java 13, за исключением того, что “break” заменен на “yield” для возврата значения из оператора case.

package com.journaldev.java13.examples;

/**
 * JEP 354: Switch Expressions
 * https://openjdk.java.net/jeps/354
 * @author pankaj
 *
 */
public class SwitchEnhancements {

	@SuppressWarnings("preview")
	public static void main(String[] args) {
		int choice = 2;

		switch (choice) {
		case 1:
			System.out.println(choice);
			break;
		case 2:
			System.out.println(choice);
			break;
		case 3:
			System.out.println(choice);
			break;
		default:
			System.out.println("integer is greater than 3");
		}

		// начиная с Java 13 - многозначные операторы case
		switch (choice) {
		case 1, 2, 3:
			System.out.println(choice);
			break;
		default:
			System.out.println("integer is greater than 3");
		}

		// выражения Switch, используйте yield для возврата значения, в Java 12 это был break
		int x = switch (choice) {
		case 1, 2, 3:
			yield choice;
		default:
			yield -1;
		};
		System.out.println("x = " + x);

	}

	enum Day {
		SUN, MON, TUE
	};

	@SuppressWarnings("preview")
	public String getDay(Day d) {
		String day = switch (d) {
		case SUN -> "Sunday";
		case MON -> "Monday";
		case TUE -> "Tuesday";
		};
		return day;
	}
}

4. Переосмысление устаревшего API сокетов – JEP 353

Была переписана основная реализация java.net.Socket и java.net.ServerSocket API. Новая реализация, NioSocketImpl, является подходящей заменой для PlainSocketImpl. Она использует блокировки java.util.concurrent вместо синхронизированных методов. Если вы хотите использовать устаревшую реализацию, используйте опцию java -Djdk.net.usePlainSocketImpl.

5. Динамический архив CDS – JEP 350

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

$ java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar

$ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar

6. ZGC: Отмена неиспользуемой памяти – JEP 351

Этот JEP улучшил ZGC для возврата неиспользуемой кучи памяти в операционную систему. Сборщик мусора Z был введен в Java 11. Он добавляет короткое время паузы перед очисткой кучи памяти. Но неиспользуемая память не возвращалась в операционную систему. Это было проблемой для устройств с небольшим объемом памяти, таких как IoT и микросхемы. Теперь он был улучшен для возврата неиспользуемой памяти в операционную систему.

7. Метод FileSystems.newFileSystem()

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

  1. newFileSystem(Path)
  2. newFileSystem(Path, Map<String, ?>)
  3. newFileSystem(Path, Map<String, ?>, ClassLoader)

8. Фабрики DOM и SAX с поддержкой пространства имен

Добавлены новые методы для создания экземпляров фабрик DOM и SAX с поддержкой пространства имен.

  1. newDefaultNSInstance()
  2. newNSInstance()
  3. newNSInstance(String factoryClassName, ClassLoader classLoader)
// начиная с Java 13
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder(); 

// до Java 13
DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder db = dbf.newDocumentBuilder();

Заключение

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

Ссылки

Source:
https://www.digitalocean.com/community/tutorials/java-13-features