Поиск по сайту:

Особенности Java 13


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

Особенности Java 13

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

  • Текстовые блоки — 355 японских японских юаней.
  • Новые методы в классе String для текстовых блоков
  • Усовершенствования выражений переключения — JEP 354
  • Повторная реализация устаревшего API сокетов — JEP 353
  • Архив динамических компакт-дисков — 350 японских японских японских юаней
  • ZGC: дефиксация неиспользуемой памяти — JEP 351
  • Метод FileSystems.newFileSystem()
  • Поддержка Юникода 12.1
  • Фабрики DOM и SAX с поддержкой пространства имен

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

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

$ jshell --enable-preview

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

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

1. Текстовые блоки — 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): аналогичен методу String format(). Он добавлен для поддержки форматирования текстовых блоков.
  2. stripIndent(): используется для удаления случайных пробелов в начале и конце каждой строки в текстовом блоке. Этот метод используется текстовыми блоками и сохраняет относительный отступ содержимого.
  3. translateEscapes(): возвращает строку, значением которой является эта строка, с escape-последовательностями, переведенными как строковый литерал.

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. Усовершенствования выражений переключателей — JEP 354

Выражения переключения были добавлены в качестве функции предварительного просмотра в выпуске Java 12. Это почти то же самое в Java 13, за исключением того, что «перерыв» был заменен на «выход», чтобы вернуть значение из оператора 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");
		}

		// from java 13 onwards - multi-label case statements
		switch (choice) {
		case 1, 2, 3:
			System.out.println(choice);
			break;
		default:
			System.out.println("integer is greater than 3");
		}

		// switch expressions, use yield to return, in Java 12 it was 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

Базовая реализация API java.net.Socket и java.net.ServerSocket была переписана. Новая реализация, 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. новая файловая система (путь)
  2. newFileSystem(Путь, Карта)
  3. newFileSystem(Path, Map, ClassLoader)

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

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

  1. newDefaultNSInstance()
  2. новыйNSInstance()
  3. newNSInstance(String factoryClassName, ClassLoader classLoader)

//java 13 onwards
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder(); 

// before java 13
DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder db = dbf.newDocumentBuilder();

Заключение

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

Рекомендации

  • Примечания к выпуску JDK 13
  • Страница загрузки OpenJDK 13
  • Примеры текстовых блоков
  • Примеры Eclipse.org для Java 13