Java 13 Functies

Java 13 werd voor productie vrijgegeven op 17 september 2019. Er zijn niet veel ontwikkelaarsspecifieke functies in Java 13 vanwege de releasecyclus van 6 maanden.

Java 13 Functies

Enkele van de belangrijke Java 13 functies zijn:

  • Text Blocks – JEP 355
  • Nieuwe Methoden in String Klasse voor Text Blocks
  • Switch Expressions Verbeteringen – JEP 354
  • Opnieuw implementeren van de Legacy Socket API – JEP 353
  • Dynamic CDS Archive – JEP 350
  • ZGC: Ongebruikt Geheugen Ontbinden – JEP 351
  • FileSystems.newFileSystem() Methode
  • Ondersteuning voor Unicode 12.1
  • DOM en SAX Factories met Namespace Ondersteuning

Hoe Preview Functies Inschakelen

Switch expressions en text blocks zijn preview functies. Dus je moet de instellingen voor preview-functies inschakelen in je project. Als je een java programma vanaf de commandoregel uitvoert, kun je het inschakelen met de --enable-preview schakelaar. Je kunt deze schakelaar gebruiken om JShell te starten met ingeschakelde preview functies.

$ jshell --enable-preview

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

Als je Eclipse IDE gebruikt, kun je de preview functies inschakelen vanuit de project Java Compiler instellingen.

Eclipse Enable Preview Features

1. Tekstblokken – JEP 355

Dit is een voorbeeldfunctie. Het stelt ons in staat om eenvoudig meerregelige strings te maken. De meerregelige string moet worden geschreven binnen een paar drievoudige dubbele aanhalingstekens. Het stringobject dat wordt gemaakt met tekstblokken heeft geen aanvullende eigenschappen. Het is een eenvoudigere manier om meerregelige strings te maken. We kunnen tekstblokken niet gebruiken om een enkele regel string te maken. De opening van drievoudige dubbele aanhalingstekens moet worden gevolgd door een regelbeëindiging.

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

Het is handig bij het eenvoudig maken van HTML- en JSON-strings in ons Java-programma.

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. Nieuwe Methoden in String Class voor Tekstblokken

Er zijn drie nieuwe methoden in de String-klasse, geassocieerd met de tekstblokkenfunctie.

  1. geformatteerd(Object… args): het is vergelijkbaar met de String format() methode. Het is toegevoegd om opmaak te ondersteunen met de tekstblokken.
  2. stripIndent(): gebruikt om de incidentele witruimtekarakters aan het begin en einde van elke regel in het tekstblok te verwijderen. Deze methode wordt gebruikt door de tekstblokken en behoudt de relatieve inspringing van de inhoud.
  3. translateEscapes(): retourneert een string waarvan de waarde deze string is, met escape-sequenties vertaald alsof het in een stringliteral staat.
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. Verbeteringen in Switch Expressions – JEP 354

Switch-expressies werden toegevoegd als een voorbeeldfunctie in de release van Java 12. Het is bijna hetzelfde in Java 13, behalve dat “break” is vervangen door “yield” om een waarde terug te geven vanuit de case-instructie.

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

		// vanaf java 13 - 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-expressies, gebruik yield om terug te keren, in Java 12 was het 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. Herimplementeer de Legacy Socket API – JEP 353

De onderliggende implementatie van de java.net.Socket en java.net.ServerSocket API’s is opnieuw geschreven. De nieuwe implementatie, NioSocketImpl, is een drop-in vervanging voor PlainSocketImpl. Het maakt gebruik van java.util.concurrent locks in plaats van gesynchroniseerde methoden. Als u de oude implementatie wilt gebruiken, gebruik dan de java-optie -Djdk.net.usePlainSocketImpl.

5. Dynamisch CDS-archief – JEP 350

Deze JEP breidt de functie voor het delen van klassengegevens uit, die werd geïntroduceerd in Java 10. Nu is het maken van een CDS-archief en het gebruiken ervan veel eenvoudiger.

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

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

6. ZGC: Ongebruikt geheugen niet toewijzen – JEP 351

Deze JEP heeft ZGC verbeterd om ongebruikt heapgeheugen terug te geven aan het besturingssysteem. De Z Garbage Collector werd geïntroduceerd in Java 11. Het voegt een korte pauzetijd toe vóór het opruimen van het heapgeheugen. Maar het ongebruikte geheugen werd niet teruggegeven aan het besturingssysteem. Dit was een punt van zorg voor apparaten met een kleine geheugenfootprint zoals IoT en microchips. Nu is het verbeterd om het ongebruikte geheugen terug te geven aan het besturingssysteem.

7. Methode FileSystems.newFileSystem()

Drie nieuwe methoden zijn toegevoegd aan de FileSystems-klasse om het gebruik van bestandssysteemproviders gemakkelijker te maken, die de inhoud van een bestand behandelen als een bestandssysteem.

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

8. DOM- en SAX-fabrieken met namespace-ondersteuning

Er zijn nieuwe methoden om DOM- en SAX-fabrieken te instantiëren met namespace-ondersteuning.

  1. newDefaultNSInstance()
  2. newNSInstance()
  3. newNSInstance(String fabrieksNaam, ClassLoader classLoader)
//java 13 en verder
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder(); 

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

Conclusie

Het lijkt erop dat de 6-maandelijkse release van Java goed heeft gewerkt. Er zijn niet veel functies specifiek voor ontwikkelaars, maar over het algemeen is het een geweldige release. Het is goed om de langverwachte ondersteuning voor tekstblokken te zien.

Referenties

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