Java 13在一小时前发布,这里有你需要了解的一切:
如果您想自己使用代码,请查看 GitHub上 [url=https://github.com/CodeFX-org/demo-java-x]的Java X Demo[/url]。
以下是Java 13最常见的IDE和构建工具的最低版本要求:
在编译为Java 13字节码时,请记住,您可能必须更新依赖于字节码操作的所有依赖项,例如Spring,Hibernate,Mockito等。
如果要使用文本块或 Switch表达式(有关它们的详细信息,请参见下文),请在构建工具配置中包含此内容:
<!-- Maven's pom.xml --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <release>13</release> <compilerArgs> --enable-preview </compilerArgs> </configuration> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>--enable-preview</argLine> </configuration> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <configuration> <argLine>--enable-preview</argLine> </configuration> </plugin>
<font><i>// Gradle's build.gradle</i></font><font> compileJava { options.compilerArgs += [</font><font>"--enable-preview"</font><font>] } test { jvmArgs '--enable-preview' } </font>
在IntelliJ IDEA中,将模块的语言级别设置为13(预览)。在Eclipse中,找到Java Compiler配置并选中Enable preview features。
升级到Java 13时获得的新语法:
文本块
将跨越多行的字符串放入代码中一直是Java的难点。现在,20多年后,我们终于得到了易于使用的多行字符串,称为文本块:
<font><i>// ugh! 以前写法</i></font><font> String jsonLiteral = </font><font>""</font><font> + </font><font>"{/n"</font><font> + </font><font>"/tgreeting: /"Hello/",/n"</font><font> + </font><font>"/taudience: /"World/",/n"</font><font> + </font><font>"/tpunctuation: /"!/"/n"</font><font> + </font><font>"}/n"</font><font>; </font><font><i>// yay! java13写法</i></font><font> String jsonBlock = </font><font>""</font><font></font><font>" { greeting: </font><font>"Hello"</font><font>, audience: </font><font>"World"</font><font>, punctuation: </font><font>"!"</font><font> } </font><font>""</font><font></font><font>"; </font>
从Switch表达式返回值
在Java 12和13中引入了Switch表达式。在12中,您将使用break定义返回值 :
<b>boolean</b> result = <b>switch</b> (Bool.random()) { <b>case</b> TRUE -> { System.out.println(<font>"Bool true"</font><font>); <b>break</b> <b>true</b>; } <b>case</b> FALSE -> { System.out.println(</font><font>"Bool false"</font><font>); <b>break</b> false; } <b>case</b> FILE_NOT_FOUND -> { <b>throw</b> <b>new</b> UncheckedIOException( </font><font>"This is ridiculous!"</font><font>, <b>new</b> FileNotFoundException()); } </font>
Java 13中你需要使用 yield:
<b>boolean</b> result = <b>switch</b> (Bool.random()) { <b>case</b> TRUE -> { System.out.println(<font>"Bool true"</font><font>); </font><font><i>// `yield` instead of `break`</i></font><font> yield <b>true</b>; } <b>case</b> FALSE -> { System.out.println(</font><font>"Bool false"</font><font>); yield false; } <b>case</b> FILE_NOT_FOUND -> { <b>throw</b> <b>new</b> UncheckedIOException( </font><font>"This is ridiculous!"</font><font>, <b>new</b> FileNotFoundException()); } </font>
新的字符串方法
String有三种新方法:
NIO改进
在NIO API中有一些小的改进:
⇝JDK -5029431:添加绝对批量 放置和 获取方法
⇝JDK -8218418: 文件。createSymbolicLink应该使用 SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
⇝ JDK-8215467: 文件。是否隐藏应返回 真正的 Windows上的隐藏目录
⇝ JDK-8218875:添加 文件系统。newFileSystem (Path ,Map < String ,?> ) 方法
Socket和ServerSocket重新实现
Project Loom 将引入光纤fibers (由JVM管理的轻量级线程),其中一部分是使块的所有代码采用相同的路径(因为这些路径随后被更改为不再阻塞线程)。
Java中重要堵塞是在 java.net.Socket 和java.net.ServerSocket下的类,它们的实现非常陈旧,并没有与Loom的方法一致,因此在准备将来的更改时,此API已重新实现。这对我们来说不应该引起注意。
为AppCDS创建类数据存档
应用程序类 - 数据共享 (AppCDS)在Java 10中免费提供,并在12和13中得到改进。它通过将大部分类加载工作移出来减少启动时间(减少10%到几乎50%)和响应时间异常值程序运行。AppCDS不是在需要时从JAR加载类数据,而是准备一个不可变的归档文件,并在JVM启动时将其映射到内存中。(或“JVM”,因为存档可以在多个实例之间共享。)
在Java 10上,使用存档过去是一个三步过程:
Java 12通过引入JVM附带并自动使用的JDK类的默认存档来放宽这一点。但您仍然必须完成上述步骤才能创建包含应用程序类的存档。这就是Java 13发挥作用的地方。
新的选项 - XX:ArchiveClassesAtExit告诉JVM照常运行,但退出(如果它没有崩溃),对类数据写入到指定的文件。然后可以将其用于未来的计划发布:
# run without CDS & create archive java -XX:ArchiveClassesAtExit=dyn-cds.jsa -jar target/java-x.jar # use created archive java -XX:SharedArchiveFile=dyn-cds.jsa -jar target/java-x.jar
此方法使用所谓的动态CDS存档,使该功能更易于使用。如果您关心反射启动时间,请试一试!
ZGC使用内存
Oracle的Z垃圾收集器(ZGC) 是一种可扩展的低延迟垃圾收集器,旨在满足独立于堆或实时集大小(从几百MB到几TB)的暂停时间,并保持在10 ms以下。在Java 13中,堆大小可以是16 TB,ZGC可以将未使用的内存返回给操作系统。命令行参数 - XX:ZUncommitDelay = <秒>可以用于配置当发生这种情况。
然后有一个新的命令行标志 - XX:SoftMaxHeapSize,通知垃圾收集器,试图限制堆到指定的大小。如果本来耗尽内存,它允许使用更多的内存,-Xmx就应该可以很好地用于返回未使用的内存。