原标题:Java 9的14个新特性总结

作者 | Aboullaite Mohammed

翻译 |Kenneth

Java 9 包含了丰富的特性集。虽然Java 9没有新的语言概念,但是有开发者感兴趣的新的API和诊断命令。

我们将快速的,着重的浏览其中的几个新特性:

模块化系统–Jigsaw 项目

模块化是一个很通用的概念。在软件中,模块化可以运用到编写和实现一个程序和计算系统,他们都是作为独立的模块,而不是作为一个单一的和完整的设计。

Java 9中主要的变化是已经实现的模块化系统。模块化的引入使得JDK可以在更小的设备中使用。采用模块化系统的应用程序只需要这些应用程序所需的那部分JDK模块,而非是整个JDK框架了。模块化系统也可以将公共的类封装到一个模块中。因此一个封装在模块中的定义为public的类不能再任何地方使用,除非一个模块显式的定义了这个模块。由于Java 9的这个变化,Java内部的API(例如com.sun.*)默认情况下是不能使用的。

简而言之,所有的模块将需要在所谓的module-info.java文件中进行描述,这个文件是位于Java代码结构的顶层。

我们的模块car(汽车)需要依赖+模块engine(引擎)和需要导出handling(操纵)包。

需要更多深入的例子可以查看OpenJDK中项目Jigsaw:模块化系统快速入门(http://openjdk.java.net/projects/jigsaw/quick-start)。

JShell–Java 9 REPL

你可能问:“REPL是什么”?REPL是一种快速运行语句的命令行工具。

在Java中,如果你想执行一个简单的语句,我们要么创建一个带main方法的类,要么创建一个可以执行的Test类。当你正在启动Java程序的时候,如果你想执行某些语句并且想立刻看见执行结果,上面的做法看起来不是那么有用了。

JShell试图去解决这个问题。Java开发者可以利用JShell在没有创建类的情况下直接声明变量,计算表达式,执行语句。JShell也可以从文件中加载语句或者将语句保存到文件中。并且JShell也可以是tab键进行自动补全的特性。

集合工厂方法

在Java 9之前,Java只能利用一些实用方法(例如:Collections.unmodifiableCollection(Collection extends T> c))创建一个不可修改视图的集合。例如,我们可以在Java 8中使用一条如下所示的语句,创建一个Collection的不可修改的视图。虽然这是最简单的创建方式,但是看起来很糟糕!不是吗?

现在,Java 9引入了一些有用的工厂方法来创建不可修改的集合。我们现在在Java 9中创建不可修改的Map集合,如下所示。

下面是工厂方法的例子:

接口中的私有方法

Java 8的接口引入了默认方法和静态方法。虽然Java 8首次计划实现接口的私有方法,却是在Java 9中实现。默认方法和静态方法可以共享接口中的私有方法,因此避免了代码冗余,这也使代码更加清晰。如果私有方法是静态的,那这个方法就属于这个接口的。并且没有静态的私有方法只能被在接口中的实例调用。

响应式流

JDK9中的Flow API对应响应式流规范,响应式流规范是一种事实标准。JEP 266包含了一组最小接口集合,这组接口能捕获核心的异步发布与订阅。希望在未来第三方能够实现这些接口,并且能共享其方式。

java.util.concurrent.Flow包含以下4个接口:

* Flow.Processor(处理器)

* Flow.Publisher(发布者)

* Flow.Subscriber(订阅者)

* Flow.Subion(订阅管理器)

这些接口都支持响应式流发布-订阅框架。Java 9也提供了实用类SubmissionPublisher。一个发布者产生一个或多个物品,这些物品由一个或多个消费者消耗。并且订阅者由订阅管理器管理。订阅管理器连接发布者和订阅者。

多分辨率图像API–JEP 251

目标是定义多分辨率图像API,这样开发者就能很容易的操作和展示不同分辨率的图像了。

这个新的API定义在java.awt.image包中,这个API能给我们带来如下的帮助:

* 将不同分辨率的图像封装到一张(多分辨率的)图像中,作为它的变体。

* 获取这个图像的所有变体。

* 获取特定分辨率的图像变体–表示一张已知分辨率单位为DPI的特定尺寸大小的逻辑图像,并且这张图像是最佳的变体。

基于当前屏幕分辨率大小和运用的图像转换算法,java.awt.Graphics类可以从接口MultiResolutionImage获取所需的变体。java.awt.image.AbstractMultiResolutionImage类提供了ava.awt.image.AbstractMultiResolutionImage 默认实现。AbstractMultiResolutionImage的基础实现是java.awt.image.BaseMultiResolutionImage。

进程API的改进

迄今为止,通过Java来控制和管理操作系统的进程的能力有限。例如,为了做一些简单的事情,像获取进程的PID,你要么需要访问本地代码,要么使用某种临时解决方案。不仅如此,每个(系统)平台需要一个不同实现来确保你能获得正确的结果。

在Java 9中,期望代码能获取Linux PID,现在是如下方式:

你可以变换如下的方式(同样支持所有的操作系统):

Try-With-Resources

在Java 7中,try-with-resouces语法要求为每一个资源声明一个新的变量,而且这些资源由try-with-resources语句进行管理。

在就Java 9中,有另外一个改进:如果一个资源被final或者等效于final变量引用,则在不需要声明一个新的变量的情况下,try-with-resources就可以管理这个资源。

钻石(diamond)操作符范围的延伸

Java 7给出的钻石操作符使我们编写代码更简单了。在下面的例子中,你可以看见Java 7中List(列表)的可读性更强了,并且使代码更加的简洁了。

但是Java 7中钻石操作符不允许在匿名类上使用。但在Java 9中改善了这一情况,允许钻石操作符在匿名类上使用。下面的例子只有在Java 9中才能通过编译。

增强的注释Deprecated

注释@Deprecated可以标记Java API。注释@Deprecated有很多种含义,例如它可以表示在不远的将来的某个时间,被标记的API将会被移除。它也可以表示这个API已经被破坏了,并不应该再被使用。它还有其它很多含义。为了提供更多有关@Deprecated的信息,@Deprecated添加了forRemoval元素和since元素。

Java SE 9 中也提供了扫描jar文件的工具jdeprscan。这款工具也可以扫描一个聚合类,这个类使用了Java SE中的已废弃的API元素。 这个工具将会对使用已经编译好的库的应用程序有帮助,这样使用者就不知道这个已经编译好的库中使用了那些已废弃的API。

统一的JVM日志

如今,我们很难知道导致JVM性能问题和导致JVM崩溃的根本原因。解决这个问题的一个方法是对所有的JVM组件引入一个单一的系统,这些JVM组件支持细粒度的和易配置的JVM日志。目前,不同的JVM组件对于日志使用的是不同的机制和规则,这使得JVM难以进行调试。

注释SafeVarargs范围的延伸

直到Java 8,@SafeVarargs才能在静态方法、final方法和构造器上使用。但是这些方法或者构造器是不能被覆盖的。这些方法中缺少另一个不能被覆盖的方法,这个方法就是私有方法。Java 9可以将@SafeVarargs添加到私有方法上。下面的例子在Java 9中是正确的,但是在Java 8中就会抛出编译时错误: 注释@SafeVarargs不能在非final的实例方法iAmSafeVaragrsMethod上使用。

HTTP 2 客户端

Java 9采用了全新的HTTP客户端API,这些API支持HTTP/2协议和WebSocket协议,并且替换了遗留的HTTPURLConnectionAPI。这些改变并不应该在Java 9中完成。这些API可以从Incubator(孵化器)模块中获取。因此在默认情况下,这个模块是不能根据classpath获取的,需要使用--add-modules命令选项配置这个模块,将这个模块添加到classpath中。

我们创建一个HTTPRequest请求和获取异步的响应:

HTML5风格的Java帮助文档

Java 8以及之前的版本生成的Java帮助文档是在HTML 4中,而HTML 4已经是很久的标准了。在Java 9中,javadoc命令行中选项部分添加了输出选项,这个选项的值要么是HTML 4,要么是HTML 5。现在HTML 4是默认的输出标记语言,但是在之后发布的JDK中,HTML 5将会是默认的输出标记语言。Java帮助文档还是由三个框架组成的结构构成,这是不会变的,并且以HTML 5输出的Java帮助文档也保持相同的结构。

更多的特性

* 保留下划线字符。变量不能被命名为_;

* 废弃Applet API;

* javac不再支持Java1.4以及之前的版本;

* 废弃Java浏览器插件;

* 栈遍历API–栈遍历API能过滤和迟访问在堆栈跟踪中的信息。返回搜狐,查看更多

更多资源:http://openjdk.java.net/projects/jdk9/

责任编辑:

java 新特性_Java 9的14个新特性总结相关推荐

  1. java枚举新特性_java回顾之枚举和新特性

    java回顾之枚举和新特性 枚举 枚举用来表示实例是固定个数的类型. 比如:季节,元注解里面学过的Retention里面RetentionPolicy也是一个注解 方法引用 格式: XXX::XXX ...

  2. Java 11新特性_java 11 值得关注的新特性

    JEP 181: Nest-Based Access Control 基于嵌套的访问控制 JEP 309: Dynamic Class-File Constants 动态类文件 JEP 315: Im ...

  3. java字符串拼接_Java 8中字符串拼接新姿势:StringJoiner

    有一个重要的拼接方式,那就是Java 8中提供的StringJoiner ,本文就来介绍一下这个字符串拼接的新兵. 如果你想知道一共有多少种方法可以进行字符串拼接,教你一个简单的办法,在Intelli ...

  4. java各个版本的特性_Java各个版本的新特性

    原链接:http://blog.csdn.net/shareus/article/details/50736159 1.5 1.自动装箱与拆箱: 2.枚举(常用来设计单例模式) http://www. ...

  5. Java 15 正式发布, 14 个新特性,刷新你的认知!!

    JDK 15 2020/09/15 如期而至! 这个时间牛逼啊,和苹果发布会同天? OracleJDK 15 发布地址: https://www.oracle.com/java/technologie ...

  6. java 6 新特性_Java SE 6 新特性: HTTP 增强(转)

    Java 语言从诞生的那天起,就非常注重网络编程方面的应用.随着互联网应用的飞速发展,Java 的基础类库也不断地对网络相关的 API 进行加强和扩展.在 Java SE 6 当中,围绕着 HTTP ...

  7. java list 初始化_Java新特性:数据类型可以扔掉了?

    在很久很久以前,我们写代码时要慎重的考虑变量的数据类型,比如下面这些: 枚举:尽管在 JDK 5 中增加了枚举类型,但是 Class 文件常量池的 CONSTANT_Class_info 类型常量并没 ...

  8. eplan文本怎么换行_JDK 14的新特性:文本块Text Blocks

    说起来,Text Blocks是在JDK13中以第一次预览版本引入的.现在在JDK14中是第二次预览版本 JEP 368: Text Blocks. 在我们日常的工作中,有时候需要用到一大段的字符串, ...

  9. JDK 14的新特性:更加好用的NullPointerExceptions

    JDK 14的新特性:更加好用的NullPointerExceptions 让99%的java程序员都头痛的异常就是NullPointerExceptions了.NullPointerExceptio ...

最新文章

  1. 工业互联网 — Overview
  2. python 数据库表结构转为类_Python数据科学实践 | 数据库1
  3. Python爬虫如何去抓取qq音乐的歌手数据?
  4. bootstrap 合并菜单_Bootstrap与tab组合,切换菜单实例
  5. java文件端点续传效果图_Java单依赖性Dockerized HTTP端点
  6. Java工作笔记-Spring Boot封装Jedis实例
  7. fastboot no permission
  8. C 语言 边读 边写入文件
  9. [转] 上级向的十个iOS面试问题
  10. “技术需求”与“技术成果”项目之间关联度计算模型 复赛top1解决方案
  11. Thymeleaf $/*/#/@语法
  12. TensorFlow实现对花朵数据集的图片分类(保证运行成功)
  13. Scala基础入门(二) Scala下载、安装教程
  14. part 8 App电量优化
  15. 格式工厂视频格式转换器下载
  16. Python下载所有XKCD漫画
  17. c语言while函数作用,c语言while(c语言while循环用法)
  18. 无线通信学习笔记(三)
  19. 2015年秋季腾讯校园招聘开发岗笔试题(四道大题)
  20. 模式分解保持函数依赖判断——数据库考试复习

热门文章

  1. 均方根值(RMS) 均方根误差(RMSE) 标准差(Standard Deviation)
  2. windows下使用cmd命令设置静态IPv4 IPv6地址
  3. 皮尔逊相关系数与p值
  4. 代码随想录【Day24】| 开始回溯!77. 组合
  5. PTA 7-51 打字
  6. 怎么用linux控制机房电脑,如何退出机房电脑控制?
  7. charCodeAt()的一些用法
  8. java学生管理系统(增删改查存)
  9. 将DataTable中的数据,根据节点的子父节点的Tag。展示到TreeView树状控件中。
  10. P2014 [CTSC1997] 选课(树形dp)