Java 13 功能

Java 13 于 2019 年 9 月 17 日发布,由于 6 个月的发布周期,Java 13 没有大量的开发人员特定的功能。

Java 13 功能

Java 13 的一些重要功能包括:

  • 文本块 - JEP 355
  • 文本块的字符串类中的新方法
  • 交换式表达式增强 - JEP 354
  • 重新实现遗传接口 API - JEP 353
  • 动态 CDS 档案 - JEP 350
  • ZGC: 未使用的内存 - JEP 351
  • 文件系统.newFileSystem() 方法 支持 Unicode 12.1
  • DOM 和 SAX 工厂与名称空间支持

如何启用预览功能

交换表达式和文本块是预览功能,因此您将需要在项目中启用预览功能设置。如果您正在从命令行运行Java程序,您可以使用--enable-preview交换机启用它。

1$ jshell --enable-preview
2
3$ java --enable-preview --source 13 Test.java

如果您正在使用 Eclipse IDE,您可以从项目Java 编译器设置启用预览功能。

Eclipse Enable Preview Features

1. 文本块 - JEP 355

这是一个预览功能. 它允许我们轻松创建多行字符串。 多行字符串必须写在一对三倍引用中。 使用文本块创建的字符串对象没有额外的属性。 这是创建多行字符串的更简单的方法。 我们不能使用文本字符串创建单行字符串。 打开三重字符串的字符串必须由一个字符串终止器跟进。

 1package com.journaldev.java13.examples;
 2
 3public class TextBlockString {
 4
 5    /**
 6     * JEP 355: Preview Feature
 7     */
 8    @SuppressWarnings("preview")
 9    public static void main(String[] args) {
10    	String textBlock = """
11    			Hi
12    			Hello
13    			Yes""";
14
15    	String str = "Hi\nHello\nYes";
16
17    	System.out.println("Text Block String:\n" + textBlock);
18    	System.out.println("Normal String Literal:\n" + str);
19
20    	System.out.println("Text Block and String Literal equals() Comparison: " + (textBlock.equals(str)));
21    	System.out.println("Text Block and String Literal == Comparison: " + (textBlock == str));
22    }
23
24}

输出:

 1Text Block String:
 2Hi
 3Hello
 4Yes
 5Normal String Literal:
 6Hi
 7Hello
 8Yes
 9Text Block and String Literal equals() Comparison: true
10Text Block and String Literal == Comparison: true

在我们的Java程序中轻松创建HTML和JSON字符串是有用的。

 1String textBlockHTML = """
 2    	<html>
 3    	<head>
 4    		<link href='/css/style.css' rel='stylesheet' />
 5    	</head>
 6    	<body>
 7                        <h1>Hello World</h1>
 8                </body>
 9                </html>""";
10
11String textBlockJSON = """
12    	{
13    		"name":"Pankaj",
14    		"website":"JournalDev"
15    	}""";

文本块的 String Class 中的新方法

在 String 类中有三个新方法,与文本块功能相关。

  1. 格式化(Object...args):它类似于 String format() 方法. 它被添加以支持与文本块的格式化
  2. stripIndent():用于从文本块中的每个行开始和结束删除随机的白色空间字符。
 1package com.journaldev.java13.examples;
 2
 3public class StringNewMethods {
 4
 5    /***
 6     * New methods are to be used with Text Block Strings
 7     * @param args
 8     */
 9    @SuppressWarnings("preview")
10    public static void main(String[] args) {
11    	
12    	String output = """
13    		    Name: %s
14    		    Phone: %d
15    		    Salary: $%.2f
16    		    """.formatted("Pankaj", 123456789, 2000.5555);
17    	
18    	System.out.println(output);
19    	
20    	
21    	String htmlTextBlock = "<html>   \n"+
22    			                    "\t<body>\t\t \n"+
23    			                        "\t\t<p>Hello</p>  \t \n"+
24    			                    "\t</body> \n"+
25    			                "</html>";
26    	System.out.println(htmlTextBlock.replace(" ", "*"));
27    	System.out.println(htmlTextBlock.stripIndent().replace(" ", "*"));
28    	
29    	String str1 = "Hi\t\nHello' \" /u0022 Pankaj\r";
30    	System.out.println(str1);
31    	System.out.println(str1.translateEscapes());
32    	
33    }
34
35}

输出:

 1Name: Pankaj
 2Phone: 123456789
 3Salary: $2000.56
 4
 5<html>***
 6    <body>		*
 7    	<p>Hello</p>**	*
 8    </body>*
 9</html>
10<html>
11    <body>
12    	<p>Hello</p>
13    </body>
14</html>
15Hi	
16Hello' " /u0022 Pankaj
17Hi	
18Hello' " /u0022 Pankaj

交换式表达式增强器 - JEP 354

作为预览功能在 Java 12版本中添加了交换表达式,在 Java 13 中几乎相同,但被替换为yield以返回案例声明中的值。

 1package com.journaldev.java13.examples;
 2
 3/**
 4 * JEP 354: Switch Expressions
 5 * https://openjdk.java.net/jeps/354
 6 * @author pankaj
 7 *
 8 */
 9public class SwitchEnhancements {
10
11    @SuppressWarnings("preview")
12    public static void main(String[] args) {
13    	int choice = 2;
14
15    	switch (choice) {
16    	case 1:
17    		System.out.println(choice);
18    		break;
19    	case 2:
20    		System.out.println(choice);
21    		break;
22    	case 3:
23    		System.out.println(choice);
24    		break;
25    	default:
26    		System.out.println("integer is greater than 3");
27    	}
28
29    	// from java 13 onwards - multi-label case statements
30    	switch (choice) {
31    	case 1, 2, 3:
32    		System.out.println(choice);
33    		break;
34    	default:
35    		System.out.println("integer is greater than 3");
36    	}
37
38    	// switch expressions, use yield to return, in Java 12 it was break
39    	int x = switch (choice) {
40    	case 1, 2, 3:
41    		yield choice;
42    	default:
43    		yield -1;
44    	};
45    	System.out.println("x = " + x);
46
47    }
48
49    enum Day {
50    	SUN, MON, TUE
51    };
52
53    @SuppressWarnings("preview")
54    public String getDay(Day d) {
55    	String day = switch (d) {
56    	case SUN -> "Sunday";
57    	case MON -> "Monday";
58    	case TUE -> "Tuesday";
59    	};
60    	return day;
61    }
62}

下一篇: Legacy Socket API - JEP 353

java.net.Socket 和 java.net.ServerSocket API 的底层实现已重新编写,新实现 NioSocketImpl 是 PlainSocketImpl 的 drop-in 替代品,它使用 java.util.concurrent 锁而不是同步方法。

动态CDS档案 - JEP 350

这个JEP扩展了在Java 10(/community/tutorials/java-10-features)中引入的类数据共享功能,现在创建CDS档案并使用它更容易。

1$ java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar
2
3$ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar

ZGC - 未使用的内存 - JEP 351

这款JEP改进了ZGC,以便将未使用的堆积记忆返回操作系统。Z Garbage Collector在Java 11(/community/tutorials/java-11 features)中引入,在堆积记忆清理之前增加了一段短暂的休息时间,但未使用的记忆不会返回操作系统,这对于物联网和微芯片等具有小记忆足迹的设备来说是一个问题。

FileSystems.newFileSystem() 方法

FileSystems 类增加了三种新方法,以便更容易使用文件系统提供商,该服务将文件的内容视为文件系统。

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

DOM 和 SAX 工厂与 Namespace 支持

有新的方法以 Namespace 支持来实例化 DOM 和 SAX 工厂。

  1. newDefaultNSInstance()
  2. newNSInstance()
  3. newNSInstance(String factoryClassName, ClassLoader classLoader)
1//java 13 onwards
2DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder(); 
3
4// before java 13
5DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance(); 
6dbf.setNamespaceAware(true); 
7DocumentBuilder db = dbf.newDocumentBuilder();

结论

看起来,Java的6个月的发布工作得很好,没有很多开发人员特定的功能,但总的来说,这是一个很好的发布,很高兴看到期待已久的文本块链支持。

参考

Published At
Categories with 技术
Tagged with
comments powered by Disqus