1. 程式人生 > >Java 9 嚐鮮之JShell互動式程式設計環境

Java 9 嚐鮮之JShell互動式程式設計環境

轉載自https://www.cnblogs.com/IcanFixIt/p/6690478.html

Java 9

JShell——Java 9 的互動式程式設計環境

本文要求讀者有基本的 Java 知識。

Tips
Java 9 的程式碼由於提供了新特性,所以有些程式碼並不支援向後相容。也就是說,用 Java 9 寫的程式碼,有可能在 Java 8 或更早版本的 JDK 上不能執行。

1. 在作業系統上安裝開發所需要的軟體

首先,你需要下載JDK 9 (Java Development Kit 9) ,需要到此網站來下載JDK 9。首先需要先同意許可協議,然後就可以下載了。
Java 9 可以執行在很多平臺上:

  • Windows 32-bit
  • Windows 64-bit
  • macOS 64-bit (以前稱之為 Mac OS X 或 OS X)
  • Linux 32-bit
  • Linux 64-bit
  • Linux on ARM 32-bit
  • Linux on ARM 64-bit

下一步需要配置環境變數。跟之前的 JDK 配置方法相同。這裡,我以 macOS 10.12 版本為例,在 Macbook 上的配置。這裡會需要 vi 的一些基本操作,可以去網上查詢如何使用。

  1. 下載完 JDK 後,直接執行。然後安裝目錄在:
    /library/Java/JavaVirtualMachines/jdk-9.jdk/
  2. 在 Terminal 下,進入到你的使用者的當前目錄下(一開啟就是你的使用者預設目錄,實在不清楚在命令列敲入cd則會切換到預設目錄下)。
  3. 在命令列中執行ls -a命令,列出當前目錄下的包括隱藏的檔案或目錄。

ls -a

4.找到 .bash_profile檔案,此檔案會影響你當前使用者的配置資訊,並執行vi .bash_profile 命令編輯此檔案。
vi .bash_profile

5.進入編輯頁面後,配置 Java Home 和 Path 環境變數:
配置 Java 環境變數

6.配置完以後,使用esc鍵退出編輯狀態,輸入“:wq”,儲存並退出。並執行
. .bash_profile,使配置檔案立刻生效。

  1. 在命令列下執行javac -version,如果輸出如下資訊,則說明 JDK 配置正確。

javac 9-ea

至此,JDK 配置完成。
啟動JShell。
在Terminal下輸jshell -v,

jshell

此時,就進入JShell 開發環境,命令列裡是以jshell>開頭。
如果想退出JShell 環境,則輸入/exit命令。

退出 jshell

2. 理解在互動式程式設計環境下開發的好處

Java 9 中引入了互動式程式設計環境(REPL),這就是JShell,它允許可以執行 Java指令碼程式碼,並且立即返回結果。因此,我們不需要建立什麼一個解決方案或工程,就能很容易地編寫程式碼並能很快的看到執行結果。我們不必等待整個專案 build 完去檢查多行程式碼的執行結果。JShell,就像其他 REPL 一樣,有利於探索式程式設計,我們很容易地進行互動式嘗試和除錯不同的演算法和結構。

3. 第一個 JShell 下的 Java 程式碼

我們簡單寫一個 JShell 下的一個 Java 程式碼,就是一個列印輸入。

 System.out.println("Hello, Java 9, now I am in JShell!")

輸出結果為:

第一個 JShell 下的 Java 程式碼

Tips
在 JShell 環境下,語句末尾的“;” 是可選的。但推薦還是最好加上。提高程式碼可讀性。

在一些例子中,我們將利用JShell 這一特性,提供對網路的訪問。此功能與Web Service互動時非常有用。然而,你必須確保你的防火牆配置不會阻擋 JShell。

4. 檢視預設匯入和使用自動補全功能

預設情況下,JShell提供了一些常用包的匯入,我們可以使用import 語句匯入必要的包或是從指定的路徑的包,來執行我們的程式碼片段。我們可以輸入以下命令列出所有匯入的包:

/imports

下面就會列出已經匯入的包:

imports

當我們在 JShell 之外寫 Java 程式碼時,如所需要的 java.lang 包是預設匯入的。在 JShell 下使用/imports命令並沒沒有列出這些包,以下是所有的在 JShell 環境下預設匯入的包:

  • java.lang
  • java.io
  • java.math
  • java.net
  • java.nio.file
  • java.util
  • java.util.concurrent
  • java.util.function
  • java.util.prefs
  • java.util.regex
  • java.util.stream

此外,JShell 提供了自動補全的功能,只需按下 Tab 鍵,就能自動補全。
但有些情況下,根據我們輸入的語句會對應很多選項,這時候 JShell 就會全部給你列出來。
例如,當我輸入 S 時,就會列出來所以以 S 開頭的類。

自動補全

當我們想輸入System類時,根據前面說的自動補全,只需要輸入Sys然後按下 Tab 鍵,則自動補全, 然後再輸入“.o”,則會自動補全方法, 在補全“System.out.”後按下 Tab 鍵,接下來就會列出當前類的所有的 public 方法的列表。

list method
最後完整輸入:

System.out.println("Auto-complete is helpful in JShell");

5. 在JShell中編寫 Java 9 程式碼

首先,在命令列下可以執行jshell -v來進入命令列的開發環境
下面我們定義calculateRectangleArea方法來計算一個正方形的面積。

float calculateRectangleArea(float width, float height) {
    return width * height;
}

calculateRectangleArea

然後輸入回車,則會輸入如下資訊:

created calculateRectangleArea

Tips
所有從 JShell 輸出的訊息用“|”表示。

輸入/list 在 JShell 中,會列出到目前為止當前 session 裡所有有效的程式碼片段。

/list

接下來我們定義一個 float型別的變數width並賦值為50:

float width = 50;

輸入完上面的程式碼後,JShell 就會給我們如下資訊:

width

然後定義height變數:

float height = 25;

接著輸入float area = ca然後自動補全為float area = calculateRectangleArea(,再輸入剛才定義的變數width 和height,則方法則計算出面積並返回1250.0。

Area

下面我們再使用/list列出到目前為之所有有效的程式碼片段。

list again

輸入以下程式碼:

System.out.printf("Width: %.2f, Height: %.2f, Area: %.2f\n", width, height, area);

則會輸入如下資訊:

width, height, area

#### 6. 計算表示式
Java 9 中執行我們評估任何有效的表示式,在 JShell中輸入如下表達式:

width * height;

當我們輸入上面的表示式,它就會給分配給一個臨時的變數,這個變數以“”開頭,並跟著一個數字。這個變數是”開頭,並跟著一個數字。這個變數是6,但也有可能是7,7,8。

$6

在當前 session 中,我們可以在接下來的程式碼中直接使用此臨時變數,例如:

System.out.printf("The calculated area is %.2f\n", $6);

$8

我們還可以使用之前的臨時變數進行響應的運算,例如,

$6 + 10.5f;

$9

7. 使用變數、方法和原始碼

到目前為止,我們建立了很多變數,我們可以使用/vars來檢視當前 session 下所有建立過的變數:

/vars

我們再定義一個方法:

float calculateRectanglePerimeter(float width, float height) {
    return 2 * (width + height);
}

然後使用/methods 來檢視所有的方法。

/methods

你也可以 修改已經存在的方法,例如,calculateRectanglePerimeter的方法改為如下:

float calculateRectanglePerimeter(float width, float height) {
    float perimeter = 2 * (width + height);
    System.out.printf("Width: %.2f\n", width);
    System.out.printf("Height: %.2f\n", height);
    System.out.printf("Perimeter: %.2f\n", perimeter);
    return perimeter;
}

然後輸出以下資訊:

change method

我們還可以使用 /list method name來檢視具體某一個方法的具體資訊:

/list method name

8. 使用外部程式碼編輯器來編寫 Java 程式碼

現在,我想對calculateRectangleArea方法做一些改動,如果這時有外部程式碼編輯器的話,做起來會很容易。
在 JShell 中可以啟用JShell Edit Pad 編輯器,需要輸入如下命令,來修改上面的方法:

/edit calculateRectangleArea

接下來就會顯示編輯器對話方塊,和將要修改的方法:

JShell Edit Pad

程式碼修改完成以後,先點選“Accept”按鈕,再點選“Exit”按鈕,則退出編輯器,在 JShell 命令列中提示方法已經修改。
JShell Edit Pad 編輯器功能非常有限,僅能提供一些最基礎的功能,不過好訊息是,JShell 可以配置外部的程式碼編輯器,我們只需要使用/edit 外部編輯器的完整路徑的方式,來指定外部的程式碼編輯器。
例如,我想使用Sublimet Text 作為外部的程式碼編譯器,則需要使用如下命令:

/set editor "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"

設定成功以後,返回如下資訊:

set editor

然後我們再執行/edit calculateRectangleArea命令,則就開啟 Sublime Text,

Sublime Text

9. 從外部載入原始碼

如果我們已經有寫好的 Java 檔案,可以使用/open 命令匯入到 JShell 環境中,例如我現在有一個Begin.java檔案,

void printHello() {
System.out.println("Hello, World!");
}

printHello()

在 JShell 環境中執行以下語句:

/open /Users/i324779/Desktop/Begin.java

載入檔案並執行:

load source code