1个月前 (01-28)  Java系列 |   抢沙发  14 
文章评分 0 次,平均分 0.0

Java9的9个新特性

Java8发布三年多后,下一个版本即将发布,暂定发布日期为2017年9月21日。您可能听说过Java9的模块系统,但这个新版本还有更多的内容。下面是Java9将提供的9个令人兴奋的新特性。

1. Java平台模块系统

Java9的定义特性是一个全新的模块系统。当代码基变得更大时,创建复杂、纠结的“意大利面代码”的几率就会成倍增加。有两个基本问题:很难真正地封装代码,而且系统的不同部分(JAR文件)之间没有显式依赖关系的概念。每个公共类都可以被类路径上的任何其他公共类访问,这会导致无意中使用不应该是公共API的类。此外,类路径本身也有问题:您如何知道是否所有必需的jar都在那里,或者是否有重复的条目?模块系统解决了这两个问题。

模块化JAR文件包含一个额外的模块描述符。在这个模块描述符中,对其他模块的依赖关系通过'requires'语句表示。此外,`exports`语句控制其他模块可以访问哪些包。默认情况下,所有未导出的包都封装在模块中。下面是一个模块描述符的示例,它位于“module-info.java`:

module blog {
  exports com.pluralsight.blog;

  requires cms;
}

我们可以将这些模块可视化如下:

Java9的9个新特性

请注意,这两个模块都包含封装的包,因为它们没有导出(用橙色盾牌显示)。没有人会意外地使用这些包中的类。Java平台本身也使用自己的模块系统进行了模块化。通过封装JDK内部类,该平台更加安全,并且更容易升级。

当启动一个模块化应用程序时,JVM会验证是否所有模块都可以基于'requires'语句进行解析,这比脆弱的类路径有了很大的进步。模块允许您通过强大的封装和显式依赖性实现更好的应用程序结构。通过本篇文章,您可以了解更多有关在Java9中使用模块的信息。

2. 链接

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

3. JShell:交互式java REPL

许多语言已经有了一个交互式的Read-Eval-Print循环,Java现在也加入了这个俱乐部。您可以从控制台启动jshell并直接开始键入和执行Java代码。jshell的即时反馈使它成为探索api和尝试语言特性的好工具。

Java9的9个新特性

测试Java正则表达式是jshell如何让您的生活更轻松的一个很好的例子。交互式shell还提供了一个很好的教学环境和生产力提升,您可以在本网络研讨会中了解更多。当你教人们如何编写Java代码时,你不再需要解释这个“publicstaticvoidmain(String[]args)”的无稽之谈。

4. 改进的Javadoc

有时是一些小事能起到很大的作用。你有没有像我一样一直用Google来找到合适的Javadoc页面?那已经没有必要了。Javadoc现在在API文档本身中包含了搜索权。另外,Javadoc输出现在与HTML5兼容。另外,您会注意到每个Javadoc页面都包含关于类或接口来自哪个JDK模块的信息。

Java9的9个新特性

5. 集合工厂方法

通常,您希望在代码中创建一个集合(例如,列表或集合),并用一些元素直接填充它。这会导致重复的代码,其中实例化集合,然后是几个“add”调用。在Java 9中,添加了几个所谓的集合工厂方法:

Set<Integer> ints = Set.of(1, 2, 3);
List<String> strings = List.of("first", "second");

除了更简短、更易于阅读之外,这些方法还使您不必选择特定的集合实现。事实上,从工厂方法返回的集合实现针对您放入的元素数量进行了高度优化。这是可能的,因为它们是不可变的:在创建后将项添加到这些集合会导致“UnsupportedOperationException”。

6. Streams API改进

Streams API可以说是Java标准库长期以来最好的改进之一。它允许您在集合上创建转换的声明性管道。使用Java9,这只会变得更好。流接口中添加了四个新方法:dropWhiletakeWhileofNullableiterate方法获得一个新的重载,允许您提供一个关于何时停止迭代的谓词:

IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

第二个参数是lambda,它返回true,直到IntStream中的当前元素变为100。因此,这个简单的示例在控制台上打印整数1到99。

除了对流本身的这些添加之外,OptionalStream之间的集成也得到了改进。现在可以使用Optional上的新“Stream”方法将可选对象转换为(可能是空的)流:

Stream<Integer> s = Optional.of(1).stream();

在组合复杂的流管道时,将可选的转换为流尤其有用。

7. 专用接口方法

Java8为我们带来了接口上的默认方法。接口现在也可以包含行为,而不仅仅是方法签名。但是,如果在一个接口上有几个默认方法,而这些方法的代码几乎做相同的事情,会发生什么呢?通常,您会重构这些方法来调用包含共享功能的私有方法。但是默认方法不能是私有的。使用共享代码创建另一个默认方法不是解决方案,因为这个helper方法成为公共API的一部分。使用Java 9,您可以向接口添加私有方法来解决此问题:

public interface MyInterface {

    void normalInterfaceMethod();

    default void interfaceMethodWithDefault() {  init(); }

    default void anotherDefaultMethod() { init(); }

    // This method is not part of the public API exposed by MyInterface
    private void init() { System.out.println("Initializing"); }
}

如果您正在使用默认方法开发api,那么私有接口方法可以有助于构建它们的实现。

8. HTTP2协议

Java9提供了一种执行HTTP调用的新方法。这个过期已久的“HttpURLConnection”API替代品还支持WebSockets和HTTP/2开箱即用。一个警告:新的HttpClient API在java9中作为所谓的孵化器模块交付。这意味着API还不能保证是100%最终版本。不过,随着Java 9的到来,您已经可以开始使用以下API:

HttpClient client = HttpClient.newHttpClient();

HttpRequest req =
   HttpRequest.newBuilder(URI.create("http://www.google.com"))
              .header("User-Agent","Java")
              .GET()
              .build();


HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());

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

9. 多版本 JARs

我们强调的最后一个特性对于库维护人员来说是一个特别好的消息。当Java的新版本出现时,您库的所有用户都需要几年时间才能切换到这个新版本。这意味着库必须向后兼容您想要支持的最旧版本的Java(例如,在许多情况下是java6或java7)。这实际上意味着您很长一段时间内都无法在库中使用Java9的新特性。幸运的是,multi-release JAR特性允许您创建仅在特定Java版本上运行库时使用的类的备用版本:

multirelease.jar
├── META-INF
│   └── versions
│       └── 9
│           └── multirelease
│               └── Helper.class
├── multirelease
    ├── Helper.class
    └── Main.class

在这种情况下,多版本.jar可以在Java9上使用,而不是顶级多重释放帮助程序类,则使用“META-INF/versions/9”下的一个。这个类的java9特定版本可以使用java9特性和库。同时,在早期的Java版本上使用这个JAR仍然有效,因为早期的Java版本只能看到顶级的Helper类。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1406.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册