Java 13 Funktionen

Java 13 wurde am 17. September 2019 für die Produktion freigegeben. Es gibt nicht viele entwicklerspezifische Funktionen in Java 13 aufgrund des 6-monatigen Veröffentlichungszyklus.

Java 13 Funktionen

Einige der wichtigen Java 13 Funktionen sind:

  • Textblöcke – JEP 355
  • Neue Methoden in der String-Klasse für Textblöcke
  • Verbesserungen bei Switch-Expressions – JEP 354
  • Neuimplementierung der Legacy-Socket-API – JEP 353
  • Dynamisches CDS-Archiv – JEP 350
  • ZGC: Nicht verwendeten Speicher freigeben – JEP 351
  • FileSystems.newFileSystem() Methode
  • Unterstützung für Unicode 12.1
  • DOM und SAX-Factories mit Namespace-Unterstützung

So aktivieren Sie Vorschau-Funktionen

Switch-Expressions und Textblöcke sind Vorschau-Funktionen. Sie müssen also die Einstellungen für Vorschau-Funktionen in Ihrem Projekt aktivieren. Wenn Sie ein Java-Programm von der Befehlszeile ausführen, können Sie es mit dem --enable-preview-Schalter aktivieren. Sie können diesen Schalter verwenden, um JShell mit aktivierten Vorschau-Funktionen zu starten.

$ jshell --enable-preview

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

Wenn Sie Eclipse IDE verwenden, können Sie die Vorschau-Funktionen in den Projekt-Java-Compiler-Einstellungen aktivieren.

Eclipse Enable Preview Features

1. Textblöcke – JEP 355

Dies ist eine Vorschauversion. Es ermöglicht uns, mehrzeilige Zeichenfolgen einfach zu erstellen. Die mehrzeilige Zeichenfolge muss innerhalb eines Paares von dreifachen doppelten Anführungszeichen geschrieben werden. Das mit Textblöcken erstellte Zeichenfolgenobjekt hat keine zusätzlichen Eigenschaften. Es ist eine einfachere Möglichkeit, mehrzeilige Zeichenfolgen zu erstellen. Wir können Textblöcke nicht verwenden, um eine Einzelzeichenfolge zu erstellen. Den öffnenden dreifachen doppelten Anführungszeichen muss ein Zeilentrenner folgen.

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));
	}

}

Output:

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

Es ist nützlich, HTML- und JSON-Zeichenfolgen leicht in unserem Java-Programm zu erstellen.

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. Neue Methoden in der String-Klasse für Textblöcke

Es gibt drei neue Methoden in der String-Klasse, die mit der Textblockfunktion verbunden sind.

  1. formatted(Object… args): Es ist ähnlich wie die Methode String format(). Es wurde hinzugefügt, um das Formatieren mit den Textblöcken zu unterstützen.
  2. stripIndent(): Wird verwendet, um die zufälligen Leerzeichen am Anfang und Ende jeder Zeile im Textblock zu entfernen. Diese Methode wird von den Textblöcken verwendet und bewahrt die relative Einrückung des Inhalts.
  3. translateEscapes(): gibt einen String zurück, dessen Wert dieser String ist, wobei Escape-Sequenzen übersetzt werden, als ob sie in einem Zeichenkettenliteral wären.
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());
		
	}

}

Output:

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 Expressions Enhancements – JEP 354

Schalterausdrücke wurden als Vorschau-Funktion im Release von Java 12 hinzugefügt. Es ist fast dasselbe in Java 13, außer dass das „break“ durch „yield“ ersetzt wurde, um einen Wert aus der case-Anweisung zurückzugeben.

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");
		}

		// ab Java 13 - Mehrfachlabel case-Anweisungen
		switch (choice) {
		case 1, 2, 3:
			System.out.println(choice);
			break;
		default:
			System.out.println("integer is greater than 3");
		}

		// Schalterausdrücke, verwenden yield zum Zurückgeben, in Java 12 war es 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. Neuimplementierung der Legacy-Socket-API – JEP 353

Die zugrunde liegende Implementierung der java.net.Socket- und java.net.ServerSocket-APIs wurde neu geschrieben. Die neue Implementierung, NioSocketImpl, ist ein Plug-and-Play-Ersatz für PlainSocketImpl. Sie verwendet java.util.concurrent-Sperren anstelle von synchronisierten Methoden. Wenn Sie die Legacy-Implementierung verwenden möchten, verwenden Sie die Java-Option -Djdk.net.usePlainSocketImpl.

5. Dynamisches CDS-Archiv – JEP 350

Dieses JEP erweitert das Feature für das Klassendatensharing, das in Java 10 eingeführt wurde. Jetzt ist die Erstellung eines CDS-Archivs und dessen Verwendung viel einfacher.

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

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

6. ZGC: Freigabe ungenutzten Speichers – JEP 351

Dieses JEP hat den ZGC verbessert, um ungenutzten Heap-Speicher an das Betriebssystem zurückzugeben. Der Z Garbage Collector wurde in Java 11 eingeführt. Er fügt eine kurze Pausenzeit vor der Bereinigung des Heap-Speichers hinzu. Aber der ungenutzte Speicher wurde nicht an das Betriebssystem zurückgegeben. Dies war ein Anliegen für Geräte mit geringem Speicherbedarf wie IoT und Mikrochips. Jetzt wurde es verbessert, um den ungenutzten Speicher an das Betriebssystem zurückzugeben.

7. Methode FileSystems.newFileSystem()

Drei neue Methoden wurden der Klasse FileSystems hinzugefügt, um es einfacher zu machen, Dateisystemanbieter zu verwenden, die den Inhalt einer Datei als Dateisystem behandeln.

  1. newFileSystem(Path)
  2. newFileSystem(Path, Map)
  3. newFileSystem(Path, Map, ClassLoader)

8. DOM- und SAX-Fabriken mit Namespace-Unterstützung

Es gibt neue Methoden, um DOM- und SAX-Fabriken mit Namespace-Unterstützung zu instanziieren.

  1. newDefaultNSInstance()
  2. newNSInstance()
  3. newNSInstance(String factoryClassName, ClassLoader classLoader)
// Java 13 und später
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder(); 

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

Fazit

Es sieht so aus, als ob die 6-monatige Veröffentlichung von Java gut funktioniert hat. Es gibt nicht viele Entwicklerspezifische Funktionen, aber insgesamt ist es eine großartige Veröffentlichung. Es ist gut zu sehen, dass die lang erwartete Unterstützung für Textblockzeichenfolgen vorhanden ist.

Referenzen

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