经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Java 11 正式发布!
来源:w3xue  时间:2018/9/26 15:38:48  对本文有异议

1.webp.jpg

和预期的时间差不多,北京时间 9 月 26 日,Oracle 官方宣布 Java 11  (18.9 LTS) 正式发布,可供生产环境中使用,此次版本的更新,不仅提高了工作效率,也提供了 HTTP/2 Client API

同时,这也是自 Oracle 宣布以六个月为周期更新后发布的第一个长期支持版本。下载地址如下:

  • https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html


I、JDK 11 主要特性


最新发布的 JDK 11 共带来了 17 项更新:

  • 181:Nest-Based Access Control(基于嵌套的访问控制

  • 309:Dynamic Class-File Constants(动态类文件常量

  • 315: Improve Aarch64 Intrinsics(改进 Aarch64 内部函数

  • 318:Epsilon: A No-Op Garbage Collector(Epsilon:No-Op 垃圾收集器

  • 320:Remove the Java EE and CORBA Modules(删除 Java EE 和 CORBA 模块)

  • 321:HTTP Client (Standard)(HTTP 客户端

  • 323:Local-Variable Syntax for Lambda Parameters(Lambda 参数的变量语法)

  • 324:Key Agreement with Curve25519 and Curve448(采用 Curve25519 和 Curve448 算法实现的密钥协议)

  • 327:Unicode 10

  • 328:Flight Recorder(飞行记录器

  • 329:ChaCha20 and Poly1305 Cryptographic Algorithms(ChaCha20 和 Poly1305 加密算法

  • 330:Launch Single-File Source-Code Programs(启动单文件源代码程序)

  • 331:Low-Overhead Heap Profiling(低开销堆分配采样方法)

  • 332: Transport Layer Security (TLS) 1.3(TLS 1.3 的传输层安全性)

  • 333:ZGC: A Scalable Low-Latency Garbage Collector(Experimental)(ZGC:可扩展的低延迟垃圾收集器,在实验阶段)

  • 335:Deprecate the Nashorn JavaScript Engine(弃用 Rhino JavaScript 引擎)

  • 336:Deprecate the Pack200 Tools and API(弃用 Pack200 工具和 API)

从开发者的角度来看,上面的特性中有几点需要特别关注。

JEP 323 实现了 Java 10 中引入的局部变量类型推断的扩展。类型推断是从其余源代码和键入规则中推导出的数据类型。这节省了开发者的工作时间,且不会使源代码过于复杂,而提高了可读性。

从 Java 10 开始,可以使用关键字 var 声明局部变量,如下所示:

  1. // Funktioniert seit Java 10
  2.  
  3. var zahl = 5; // int
  4. var string = "Hello World"; // String
  5. var objekt = BigDecimal.ONE; // BigDecimal

在 Java 11 中,不同点在于开发者可以使用 var 声明 lambda 参数。乍一看,这一举措似乎有点多余,因为在写代码过程中可以省略 lambda 参数的类型,并通过类型推断确定它们。但是,扩展名对于使用 @Nonnull 和 @Nullable 等类型注释很有用。

  1. // Inference von Lambda-Parametern
  2. Consumer<String> printer = (var s) -> System.out.println(s); // statt s -> System.out.println(s);
  3.  
  4. // aber keine Mischung von "var" und deklarierten Typen m?glich
  5. // BiConsumer<String, String> printer = (var s1, String s2) -> System.out.println(s1 + " " + s2);
  6.  
  7. // Nützlich für Type Annotations
  8. BiConsumer<String, String> printer = (@Nonnull var s1, @Nullable var s2) -> System.out.println(s1 + (s2 == null ? "" : " " + s2));

JDK 11 中另一个亮点在于仍处于实验阶段的新 HTTP Client API 的标准化,该 API 在 JDK 9 中被引入,在 JDK 10 中进行了更新,在本次 JDK 11 中包名由 jdk.incubator.http 改为 java.net.http。HTTP Client API 除了实现了HTTP(1.1和2)、WebSocket,同步和异步调用以及 Reactive Streams 现在也受支持。还使用清晰易懂的 Fluent 界面,将来可能会淘汰其他 HTTP 客户端(如 Apache)的使用。

  1. HttpClient client = HttpClient.newHttpClient();
  2. HttpRequest request = HttpRequest.newBuilder()
  3.       .uri(URI.create("http://openjdk.java.net/"))
  4.       .build();
  5. client.sendAsync(request, asString())
  6.       .thenApply(HttpResponse::body)
  7.       .thenAccept(System.out::println)
  8.       .join();


JEP 330(启动单文件源代码程序)现在可以启动尚未编译的类。如今单文件程序在编写小实用程序时很常见,特别是脚本语言领域。从中开发者可以省去用 Java 编译程序等不必要工作,以及减少新手的入门障碍。在基于 Java 10 的程序中可以通过三种方式启动:

  • 作为* .class文件

  • 作为* .jar文件中的主类

  • 作为模块中的主类

现在,Java 11 中可以在源代码文件中声明类:

  1. # java HelloWorld.java
  2. // statt
  3. # javac HelloWorld.java
  4. # java -cp . hello.World

在 Unix 操作系统上,Java 文件甚至可以直接作为 Shebang 文件执行:

  1. #!/path/to/java --source version
  1. # ./HelloWorld.java

其他值得注意的变化包括支持 Unicode 10 标准以及将 Profiler Flight Recorder 集成到 OpenJDK 中(之前仅适用于 Oracle JDK)。Flight Recorder 的目标是尽可能高效地记录应用程序数据,以便在出现问题时分析 Java 应用程序和 JVM。

API 的变化

此外,Java 类库也有不少小的改动。 特别是字符串:

  1. |  Welcome to JShell -- Version 11
  2. |  For an introduction type: /help intro
  3. // Unicode zu String
  4. jshell> Character.toString(100)
  5. $1 ==> "d"
  6. jshell> Character.toString(66)
  7. $2 ==> "B"
  8.  
  9. // Zeichen mit Faktor multiplizieren
  10. jshell> "-".repeat(20)
  11. $3 ==> "--------------------"
  12.  
  13. // Enth?lt ein Text keine Zeichen (h?chstens Leerzeichen)?
  14. jshell> String msg = "hello"
  15. msg ==> "hello"
  16. jshell> msg.isBlank()
  17. $5 ==> false
  18. jshell> String msg = "  "
  19. msg ==> "  "
  20. jshell> msg.isBlank()
  21. $7 ==> true
  22.  
  23. // Abschneiden von führenden oder nachgelagerten Leerzeichen
  24. jshell> " hello world ".strip()
  25. $8 ==> "hello world"
  26. jshell> "hello world    ".strip()
  27. $9 ==> "hello world"
  28. jshell> "hello world    ".stripTrailing()
  29. $10 ==> "hello world"
  30. jshell> "        hello world    ".stripLeading()
  31. $11 ==> "hello world    "
  32. jshell> "    ".strip()
  33. $12 ==> ""
  34.  
  35. // Texte zeilenweise verarbeiten
  36. jshell> String content =  "this is a multiline content\nMostly obtained from some file\rwhich we will break into lines\r\nusing the new api"
  37. content ==> "this is a multiline content\nMostly obtained fro ... ines\r\nusing the new api"
  38. jshell> content.lines().forEach(System.out::println)
  39. this is a multiline content
  40. Mostly obtained from some file
  41. which we will break into lines
  42. using the new api

Java 11 计划于本月,即 9 月 25 日发布。与 Java 10 不同,Java 11 不仅提供了长期支持,还将作为 Java 平台的参考实现。新的长期支持版本每三年发布一次,根据后续的发布计划,Java 17 将于 2021 年发布。

Java 11:删除了什么?

Oracle JDK 将不再包含 JavaFX(OpenJDK 从未提供过)。相反,JavaFX 通过 OpenJFX 作为单独的下载提供,并且可以像任何 Java 应用程序中的任何其他库一样使用。除 JavaFX 外,还将停止对 Applet 和 Java Web Start 的支持。如果仍然想使用 Java Web Start,那么必须保持在 JDK 8 的版本,直至 Oracle 停止免费更新后,花钱购买该服务。

另一个在 Java 11 中被弃用的 JavaScript 引擎 Rhino。预计它将在 Java 的未来版本中彻底消失。不过值得注意的是,Rhino 从未真正将自己断言为 Node.js 上的服务器端 JavaScript 实现基础。通过 GraalVM,Oracle 现在采用其他方式在 JVM 上本地运行其他编程语言。

顺便说一下,从 Java 11 开始,Java 运行时环境(JRE)将仅存在于服务器版本中,而不再存在于桌面中。但是,对于具有模块系统和 jlink 工具的桌面应用程序,开发者现在可以轻松创建或调整运行时环境。


||、JDK 11 是否值得更新?


今年四月,Oracle 发布官方声明表示即将停止对 JDK 8 的正常支持(免费更新):

2019 年 1 月之后,Oracle 将不会在其网站上发布 Java SE 8 商业使用的进一步更新下载。如需持续获取安全的 Bug 修复和安全补丁以及 Java SE 8 或以前版本的稳定性支持,可以通过 Oracle Java SE 高级版、Oracle Java SE 高级桌面、或 Oracle  Java SE 套件。

1.webp (1).jpg

这意味着,在 2019 年 1 月之后,开发者想要使用老版本只能付费了,从中也侧面看出,Oracle 在间接性鼓励用户主动升级。不过,据各种对 Java 用户调查如 Jaxenter 发现,大多数的开发者依旧停留在 Java 8 以内的版本。

2.webp.jpg

其实,这也不足为怪,当开发者刚开始吐槽新版本带来的问题时,Java 已搭载上了火箭更新到了下一版本,让大家措手不及。此前,就连 Java Collection Framework 的创建者 Josh Bloch 都在吐槽 Java 9 模块系统(Project Jigsaw)带来令人头痛的问题,甚至建议:

现在说 Project Jigsaw 将在 JDK 之外实现广泛使用还为时过早。与此同时,除非你有迫切需要,否则最好避免使用它们。

那么对于 JDK 11 是否值得立即更新使用?按照 Oracle 公布支持的路线图来看,如文章开头所述,Java 11 将会获得 Oracle 长期的服务支持,直至 2026 年 9 月。相比 Java 9 和 10 这两个仅提供半年技术支持的版本来说,JDK 11 的发布无疑对个人开发者以及企业都是一件好事。

3.webp.jpg

那么,再结合其新特性,你会选择更新到 JDK 11 吗?

参考:

https://jaxenter.de/java-11-features-news-75411

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号