Java 9 中的新特性
December 14, 2017

平台级模块化系统

没有模块化之前 Java 中存在的问题:

  • JDK 过于臃肿
  • JAR 文件(如 rt.jar)过于臃肿,无法在小的设备或程序中使用
  • 封装不够强大,public 修饰符允许任何人访问
  • 不同版本的类库交叉依赖,无法确定是否共同依赖了相同的 JAR

Java SE 9: Jigsaw Project

Java 9 的模块化是通过工程 Jigsaw 引入的
参考链接 http://openjdk.java.net/projects/jigsaw/

The primary goals of this Project were to:

  • Make it easier for developers to construct and maintain libraries
  • and large applications;
  • Improve the security and maintainability of Java SE Platform Implementations in general, and the JDK in particular;
  • Enable improved application performance; and
  • Enable the Java SE Platform, and the JDK, to scale down for use in small computing devices and dense cloud deployments.

Jigsaw 的主体被拆分分以下 6 个部分:

Java 9 模块化系统的优点:

  • JDK,JRE,JAR 等都将被划分为小模块,有利于将 Java 应用到小的设备或程序
  • 易于测试和维护
  • 提供更强的封装

接口中的私有方法参考网址

https://www.journaldev.com/12850/java-9-private-methods-interfaces

在 Java 7 中,接口中只能有两种东西

  1. 常量
  2. 抽象方法
public interface Java7Interface {
    // 默认省略 public
    public int constVariable = 0;

    // 默认省略 public abstract
     void abstractMethod();
}

在 Java 8 中,接口中可以有默认方法和静态方法,但是这些方法都是公有的,

  1. 常量
  2. 抽象方法
  3. 默认方法
  4. 静态方法
public interface Java8Interface {

    // 默认省略 public
    default void defaultMethod() {
        System.out.println("I am a default method");
    }

    // 默认省略 public
    static void staticMethod() {
        System.out.println("I am a static method");
    }

}

在 Java 9 中,允许在接口中使用私有方法

  1. 常量
  2. 抽象方法
  3. 默认方法
  4. 静态方法
  5. 私有方法
  6. 私有静态方法
public interface Java9Interface {

    private void privateMethod() {
        System.out.println("I am a private static");
    }

    private static void privateStaticMethod(){
        System.out.println("I am a private static method");
    }

    // 编译错误,只有接口私有方法,没有私有接口变量
    // private int privateVariable = 0;
}

Java 9 中,接口私有方法使用规则:

  1. 必须用private显式声明

    • 接口中所有方法默认是公有的
  2. private修饰符无法与abstract共存,否则会导致编译错误

    • private方法表示这个方法已经被接口实现,子类无法继承和覆盖
    • abstract方法表示这个这个方法还没有实现,子类必须继承并覆盖
  3. 私有方法必须有实现
  4. private修饰符代表最低的可见性

    • 只有这个在这个接口才能访问到这个方法

为什么需要接口私有方法 Java8 中,若接口的默认方法如果有重复的代码,则无法封装重用,因此使用接口私有方法可以:

  1. 实现代码复用
  2. 仅暴露公有方法给客户端

Java 9 REPL (JShell)

Java 9 提供了一个交互式的编程环境, REPL(Read Evaluate Print Loop).可以从控制台启动 JShell 来使用

G:\>jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro


jshell> int a = 10
a ==> 10

jshell> System.out.println("a value = " + a )
a value = 10

集合的工厂方法

Java 9 中引入了一些便捷的方法用来创建不可修改的 List,Set,Map 和 Map.Entry.

List immutableList = List.of();
List immutableList = List.of("one","two","three");

改进的 Stream API

Java 9 中 Stream 接口增加了有些便捷的方法,如dropWhiletakeWhile

try-with-resource 的改进

https://www.journaldev.com/12940/javase9-try-with-resources-improvements

Java 7 中的 try-with-resource

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }
}

Java 9 中的 try-with-resource

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}