Java 9 新特性

Java9在語言上並無添加太多的新特性,但在使用、性能上作了很改進。html

1、模塊間引用

Java9添加了模塊化的概念,使得以前的控制訪問權限有了改變。
以前:java

  • public
  • protect
  • (default,package)
  • private

Java9shell

  • public to everyone
  • public but only for specific user
  • public within a module
  • protect
  • (default,package)
  • private

能夠看到,對public類又作了進一步的限制,主要是對模塊間的依賴作出限制,使得模塊可以控制那些public類型可以被其餘模塊讀取,以及該模塊須要使用其餘模塊的類型。oracle

如何定義模塊

在src根目錄下,建立module-info.java:模塊化

// 該模塊的名稱爲 module.one
module module.one {
    // 該包下的全部public類型對其餘模塊可見
    export package.name;
    // 該public類型對其餘模塊可見
    export class.name;
}
// 該模塊的名稱爲 module.two
module module.two {
    // 該模塊將引用模塊1
    // 該模塊將可以使用模塊1所開放的public類型
    // 其餘的pubic類型將不可見
    require module.one;
}

以上是最簡單的模塊使用方式。工具

2、多版本jar包支持

即在不一樣java版本下,執行相應版本的代碼。好比DateUtil.java,若在java7環境下,將執行java7的代碼,在java8的環境下,將執行java8的代碼。
在發佈新版本的java後,用戶可能不會升級到新環境, 可是項目可能會開始逐步升級到新版本,來提早適應即將到來的環境。此時就要對多個版本的支持。性能

實現

$ javac --release 11 java11/com/xiao/test/Tester.java
$ javac --release 8 java8/com/xiao/test/Tester.java
$ tree
.
├── java11
│   └── com
│       └── xiao
│           └── test
│               ├── Tester.class
│               └── Tester.java
└── java8
    └── com
        └── xiao
            └── test
                ├── Tester.class
                └── Tester.java

8 directories, 4 files
$ jar -v -c -f multiversion.jar -C java8 com/xiao/test/Tester.class --release 11 -C java11 com/xiao/test/Tester.class
已添加清單
正在添加: com/xiao/test/Tester.class(輸入 = 428) (輸出 = 296)(壓縮了 30%)
正在添加: META-INF/versions/11/com/xiao/test/Tester.class(輸入 = 429) (輸出 = 296)(壓縮了 31%)
$  ls
java11            java8            multiversion.jar
$ /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/bin/java -cp multiversion.jar com.xiao.test.Tester
In Java8
$ /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/bin/java -cp multiversion.jar com.xiao.test.Tester
In Java11

3、Interface加強(可添加私有方法)

public interface PrivateMethod {
    // java7之前
    // 默認爲 public static final
    String NAME = "xiao";
    // 默認爲 public
    String get();

    // java8
    default void giveMyMoney() {
        System.out.println("No way!!!");
    }

    static void makeFriend() {
        System.out.println("Hello, my friend.");
    }
    
    // java9
    private void show() {
       System.out.println("Nobody can find me.");
    }
}

4、JShell

提供互交式的工具。ui

$ jshell
|  歡迎使用 JShell -- 版本 11.0.1
|  要大體瞭解該版本, 請鍵入: /help intro

jshell> /help intr
|  
|                                   intro
|                                   =====
|  
|  使用 jshell 工具能夠執行 Java 代碼,從而當即獲取結果。
|  您能夠輸入 Java 定義(變量、方法、類等等),例如:int x = 8
|  或 Java 表達式,例如:x + x
|  或 Java 語句或導入。
|  這些小塊的 Java 代碼稱爲「片斷」。
|  
|  這些 jshell 工具命令還可讓您瞭解和
|  控制您正在執行的操做,例如:/list
|  
|  有關命令的列表,請執行:/help

jshell> System.out.println("The first time use jshell");
The first time use jshell

jshell> String a = "xiao"
a ==> "xiao"

jshell> System.out.println("name" + a)
namexiao

jshell> System.out.println("name:" + a)
name:xiao

jshell>

5、try/catch加強

Java6以及以前的版本中,在使用一些資源時,一般會使用try/catch語句,而且在finally語句中來關閉資源,Java7作了改進,Java9也作了一點改進。code

public class TryCatchImprove {
    public static void main(String[] args) {
        // Java 6 or early
        // 使用的資源,建議都在finally塊中關閉
        InputStreamReader inputStream7 = new InputStreamReader(System.in);
        try {
            int i = inputStream7.read();
        } catch (IOException ie) {
            ie.printStackTrace();
        } finally {
            try {
                inputStream7.close();
            } catch (IOException ie) {
                ie.printStackTrace();
            }
        }

        // Java 7,8
        // 當有多個資源被使用時,括號中使用 ; 分割,再也不須要finally語句塊
        try (InputStreamReader inputStream8 = new InputStreamReader(System.in)) {
            int i = inputStream8.read();
        } catch (IOException ie) {
            ie.printStackTrace();
        }

        // Java 9
        // 可以直接在try的括號中使用變量,多個變量時用 ; 分割
        InputStreamReader inputStream9 = new InputStreamReader(System.in);
        try (inputStream9) {
           int i = inputStream9.read(); 
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}

參考

更多更詳細的特性,能夠參照如下:htm

相關文章
相關標籤/搜索