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

Функции Java 13

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

Автор оригинала: Pankaj Kumar.

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

Функции Java 13

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

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

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

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

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

$ jshell --enable-preview

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

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

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

1. Текстовые блоки – JEP 355

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

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

За открывающими тройными двойными кавычками должен следовать терминатор строки.

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 = """
		
		
			
		
		
                        

Hello World

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

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

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

  1. форматированный(объект… args): он аналогичен методу String format (). Он добавлен для поддержки форматирования с текстовыми блоками.
  2. stripIndent(): используется для удаления случайных пробелов в начале и конце каждой строки текстового блока. Этот метод используется текстовыми блоками и сохраняет относительный отступ содержимого.
  3. translate Escapes(): возвращает строку, значением которой является эта строка, с 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 = "   \n"+
				                    "\t\t\t \n"+
				                        "\t\t

Hello

\t \n"+ "\t \n"+ ""; 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

***
			*
		

Hello

** * *

Hello

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

Базовая реализация java.net.Сокета и java.net.API-интерфейсы ServerSocket были переписаны. Новая реализация, Nio Socket Impl, является заменой PlainSocketImpl.

Он использует java.util.параллельные блокировки, а не синхронизированные методы. Если вы хотите использовать устаревшую реализацию, используйте опцию java -Djdk.net.используйте PlainSocketImpl .

5. Динамический архив компакт-дисков – JEP 350

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

$ 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

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

7. Файловые системы.Метод newFileSystem()

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

  1. Новая файловая система(Путь)
  2. новая файловая система(Путь, Карта<Строка, ?>)
  3. Новая файловая система(Путь, Карта<Строка, ?>, Загрузчик классов)

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

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

  1. новый экземпляр По Умолчанию()
  2. новая установка()
  3. newinstance(Строка factoryClassName, загрузчик классов Загрузчик классов)
//java 13 onwards
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder(); 

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

Вывод

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

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