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 编译器设置启用预览功能。
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 类中有三个新方法,与文本块功能相关。
- 格式化(Object...args):它类似于 String format() 方法. 它被添加以支持与文本块的格式化
- 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 类增加了三种新方法,以便更容易使用文件系统提供商,该服务将文件的内容视为文件系统。
- newFileSystem(Path)
- newFileSystem(Path, Map<String,?>)
- newFileSystem(Path, Map<String,?>, ClassLoader)
DOM 和 SAX 工厂与 Namespace 支持
有新的方法以 Namespace 支持来实例化 DOM 和 SAX 工厂。
- newDefaultNSInstance()
- newNSInstance()
- 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个月的发布工作得很好,没有很多开发人员特定的功能,但总的来说,这是一个很好的发布,很高兴看到期待已久的文本块链支持。