,,深入讲解Java 9中的九个新特性

,,深入讲解Java 9中的九个新特性

经过三年多的Java发布,2017年7月下一次发布的日期正在临近。您可能听说过Java 9的模块系统,但在这个新版本中还有许多其他更新。下面是Java 9将发布的9个令人兴奋的新特性。有需要的朋友可以参考学习。让我们一起来看看吧。

本文主要和大家分享Java 9中的9个新特性,对你有一定的参考价值。我们来看看详细介绍:

一、Java 平台级模块系统

Java 9的定义函数是一个全新的模块系统。随着代码库变得越来越大,创建复杂且交织在一起的“意大利面条式代码”的概率呈指数级增长。这时候我们要面对两个基本问题:很难真正封装代码,系统对不同部分(也就是JAR文件)之间的依赖关系没有一个清晰的概念。每个公共类都可以被类路径下的任何其他公共类访问,这将导致无意中使用不打算被公共访问的API。此外,类路径本身也有一些问题:如何知道所有需要的jar都已经存在,或者是否会有重复项?该系统解决了这两个问题。

所有的模块化JAR文件都包含一个附加的模块描述符。在这个模块描述符中,对其他模块的依赖由“需求”来表示。此外,“exports”语句控制哪些包可以被其他模块访问。默认情况下,所有未导出的包都封装在模块中。以下是模块描述符的示例,它存在于“module-info.java”文件中:

模块博客{

导出com . plural sight . blog;

需要cms

}

我们可以显示模块如下:

请注意:两个模块都包含封装的包,因为它们尚未导出(用橙色盾牌显示)。没有人会意外地使用这些包中的类。Java平台本身是模块化的,有自己的模块系统。通过封装JDK的内部类,平台更安全,持续改进更容易。

当一个模块化的应用程序启动时,JVM将验证是否所有的模块都可以使用,这比基于requires '语句3354的脆弱的类路径前进了一大步。模块允许您更好地强制应用程序的结构化封装,并明确依赖关系。在本课程中,您可以学到更多关于Java 9中模块工作的知识。

二、Linking

当您使用具有显式依赖关系和模块化JDK的模块时,新的可能性就会出现。现在,您的应用程序模块将声明它对其他应用程序模块以及它所使用的JDK模块的依赖性。为什么不使用这些信息来创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢?这可以通过Java 9中新的jlink工具来实现。您可以创建针对您的应用程序优化的最小运行时映像,而无需使用完全加载的JDK安装。

三、JShell: 交互式 Java REPL

许多语言已经有了交互式编程环境,Java现在也加入了这个俱乐部。可以从控制台启动jshell,直接启动Java代码的输入和执行。j的即时反馈使它成为探索API和尝试语言特性的好工具。

测试Java正则表达式是一个很好的例子,说明了jshell如何让您的生活变得更加轻松。交互式shell还可以提供良好的教学环境,提高工作效率。你可以在这里了解更多。在教人如何写Java的过程中,已经不需要解释“public static void main(string[]args)”这种废话了。

四、改进的 Javadoc

有时候小事情可以造成很大的不同。你有没有像我一样一直在用Google找合适的Javadoc页面?这个已经不需要了。Javadoc现在支持在API文档中搜索。此外,Javadoc的输出现在符合HTML5标准。此外,您会注意到每个Javadoc页面都包含关于JDK模块类或接口的源代码的信息。

五、集合工厂方法

通常,您希望在代码中创建一个集合(例如,List或Set ),并直接用一些元素填充它。实例化集合,几次“添加”调用,并使代码重复。Java 9,增加了几个集合工厂方法:

SetInteger ints=Set.of(1,2,3);

list string strings=list . of(' first ',' second ');

除了更短、更易读之外,这些方法还会阻止您选择特定的集合实现。事实上,返回集合的实现是经过高度优化的,在集合中已经从工厂方法中放入了几个元素。这是可能的,因为它们是不可变的:创建后,继续向这些集合添加元素将导致“UnsupportedOperationException”。

六、改进的 Stream API

长期以来,流API一直是Java标准库的最佳改进之一。通过这个API,可以在集合上建立转换的声明管道。在Java 9中会变得更好。Stream接口中增加了四个新方法:dropWhile、takeWhile、ofNullable。iterate method还有一个新的重载方法,它允许您提供一个谓词(判断条件)来指定何时结束迭代:

IntStream.iterate(1,i - i 100,i - i 1)。forEach(system . out:println);

第二个参数是Lambda,当当前IntStream中的元素达到100时,它将返回true。所以这个简单的例子就是把1到99打印到控制台。

除了Stream本身的扩展,Optional和Stream之间的组合也得到了改进。现在可以通过Optional的新方法“stram”将可选对象转换为(可能为空的)stram对象:

StreamInteger s=Optional.of(1)。stream();

在组合复杂的流管道时,将Optional转换为Stream非常有用。

七、私有接口方法

Java给我们带来了默认的接口方法。现在接口也可以包含行为,而不仅仅是方法签名。但是,如果接口上有几个默认的方法,代码几乎一样,会怎么样呢?通常,您会重构这些方法并调用一个可重用的私有方法。但是默认方法不能是私有的。将重用代码创建为默认方法不是一个解决方案,因为辅助方法将成为公共API的一部分。使用Java 9,您可以在接口中添加私有帮助器方法来解决这个问题:

公共接口MyInterface {

void normal interface method();

default void interface methodwithdefault(){ init();}

default void another default method(){ init();}

//此方法不是MyInterface公开的公共API的一部分

private void init(){ system . out . println(' Initializing ');}

}

如果使用默认方法开发API,那么私有接口方法可能有助于构建其实现。

八、HTTP/2

Java 9中有新的方法来处理HTTP调用。这个迟到特性用于替换旧的HttpURLConnection` API,并提供对WebSocket和HTTP/2的支持。注意:新的HttpClient API在Java 9中作为一个所谓的孵化器模块提供。换句话说,这个API不能保证100%完成。但是您可以在Java 9中开始使用这个API:

http client client=http client . newhttpclient();

HttpRequest请求=

http request . new builder(uri . create(' http://www . Google . com '))。标题('用户代理',' Java ')。获取()。build();

HttpResponseString resp=client . send(req,HttpResponse。body handler . asstring());

除了这个简单的请求/响应模型,HttpClient还提供了新的API来处理HTTP/2的特性,比如流和服务器端推送。

九、多版本兼容 JAR

最后,我们想要强调的这个特性对于库的维护者来说是个好消息。当一个新版本的Java出现时,你的图书馆用户将需要几年的时间来切换到这个新版本。这意味着这个库必须向后兼容您想要支持的最老的Java版本(在许多情况下是Java 6或7)。事实上,这意味着在未来很长一段时间内,你都无法在库中使用Java 9提供的新特性。幸运的是,多版本兼容的JAR特性允许您创建一个类版本,您只能在特定版本的Java环境中运行程序时选择使用这个类版本:

多释放. jar

元信息

9

多重释放

Helper.class

多重释放

助手. class

主阶级

在上面的场景中,可以在Java 9中使用multirelease.jar,但是Helper类不使用顶级的multirelease。Helper类,而是“META-INF/versions/9”下的那个。这是专门为Java 9准备的类版本,可以使用Java 9提供的特性和库。同时,在早期版本的Java中使用这个JAR也可以运行,因为旧版本的Java只会在顶层看到这个Helper类。

正如你所看到的,Java 9提供了很多或大或小的特性。你准备好了吗?

总结

这就是本文的全部内容。希望这篇文章的内容能给你的学习或者工作带来一些帮助。有问题可以留言交流。谢谢你的支持。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: