サイトロゴ

Java開発が爆速に!超便利なJShellの使い方

著者画像
Toshihiko Arai

はじめに

JShellは、Java 9以降で導入されたREPL(Read-Eval-Print Loop)環境です。コンパイルなしで手軽にJavaのコードを試すことができ、開発やデバッグ、学習に非常に役立ちます。

本記事では、MacでJShellを使う方法と、実際に試せるサンプルコードを紹介します。

MacでJShellを使う方法

MacでJShellを使うには、以下の手順を実行します。

1. Javaがインストールされているか確認

java -version

Java 9以上がインストールされている場合、以下のようなバージョン情報が表示されます。

openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.2+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.2+12, mixed mode, sharing)

もしJavaがインストールされていない場合は、brewなどでインストールしておきます。

brew install openjdk

2. JShellを起動

Javaがインストールされている場合、以下のコマンドでJShellを起動できます。

jshell

起動すると、以下のようなプロンプトが表示されます。

|  JShellへようこそ -- バージョン14.0.2
|  概要については、次を入力してください: /help intro

jshell>

これでJShellの準備が完了です。 終了する場合は /exit を入力するか、または control + d でJShellを修了できます。


String.valueOf の挙動を確認する

JShellを使うと、メソッドの動作をすぐに確認できます。ここでは String.valueOf の挙動をチェックしてみます。

jshell> String.valueOf(null)
|  例外java.lang.NullPointerException
|        at String.<init> (String.java:269)
|        at String.valueOf (String.java:3402)
|        at (#1:1)

null を渡すと NullPointerException になります。

jshell> String.valueOf("Hello")
$1 ==> "Hello"

jshell> String.valueOf(123)
$2 ==> "123"

jshell> String.valueOf(3.14)
$3 ==> "3.14"

文字列や数値を渡すと、それに対応する String 型の値が返ってきます。


Errorが発生する事例

JShellでは、即座にエラーの検証もできます。 例えば、未定義の変数を使おうとするとエラーになります。

jshell> System.out.println(undefinedVar);
|  Error:
|  cannot find symbol
|    symbol:   variable undefinedVar
|  System.out.println(undefinedVar);

また、型不一致のケースもエラーになります。

jshell> int num = "text";
|  Error:
|  incompatible types: java.lang.String cannot be converted to int

private staticなメソッドの挙動を確認する

次に、private static なメソッドがインスタンス間で共有されるかを試してみましょう。

検証コード

class Test {
     private static int counter = 0;
     static void increment() { counter++; }
     static int getCounter() { return counter; }
}

インスタンスを複数作成し、カウンターが共有されるか確認します。

jshell> Test t1 = new Test();
jshell> Test t2 = new Test();

jshell> t1.increment();
jshell> System.out.println(t2.getCounter());
1

counterstatic なので、すべてのインスタンスで共有されていることが確認できました。

ただし Testクラスとは別のクラスで static void increment() が実装されていた場合、たとえ同じメソッド名でも別クラスのインスタンス間では共有されません。


StringUtils.isEmpty のようなライブラリをJShellで実行する

StringUtils.isEmpty(null)jshell で実行するには、まず StringUtils クラスを含む Apache Commons Lang ライブラリを jshell に追加する必要があります。

1. ライブラリのダウンロード

Apache Commons Lang から commons-lang3-3.x.x.jar をダウンロード。

2. jshell を起動

ターミナル(コマンドプロンプト)で以下のように jshell を起動:

jshell --class-path /path/to/commons-lang3-3.x.x.jar

/path/to/commons-lang3-3.x.x.jar は、ダウンロードした JAR のパスに置き換えてください

3. StringUtils をインポートして実行

import org.apache.commons.lang3.StringUtils;
System.out.println(StringUtils.isEmpty(null));  // 結果: true

まとめ

JShellを使えば、簡単にJavaの動作検証ができました。わざわざ IntelliJ などのIDEでプロジェクト作成やテストコードを書かずとも、動作検証できて非常に便利です。開発のちょっとした確認や学習に、JShellをぜひ活用してみてください!


関連記事