SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Java 9で「変わること」と、Javaのこれまで

手軽にJavaの実行結果が確認できるJava 9の新しいツール「JShell」

Java 9で「変わること」と、Javaのこれまで 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 前回は、Java 9における最も大きな変更であるモジュール機能(Project Jigsaw)について解説しました。今回は新たに追加されたツールである「JShell」(Project Kulla)を紹介します。JShellはJavaの仕様や動作などの変更とは違い、より広い利用者にJavaを使ってもらう、または、より便利にJavaを使ってもらうといった目的のために用意されたツールです。

  • X ポスト
  • このエントリーをはてなブックマークに追加

学習や動作確認に使用できるJShellとは

 「JShell」とは、Java 9で提供される新たなツールの1つです。JShellを使えば、コードをjavaコマンドでコンパイルし、その後、javaコマンドで実行するという手順を行わなくても、実行結果が確認できます。

 このような環境をREPL(Read-eval-print loop)と呼びます。JShellは、Java 9のSDKから標準で利用できるREPL環境です。

[Note]さまざまなREPL

 REPL環境について他の言語も含めて体験してみたい方は、さまざまな言語でREPL環境を提供しているWebサービス、「repl.it」を利用してみてください。

 これまでJavaを学習したい場合にはJava SEをインストールし、EclipseやNetBeans、またはIntelliJ IDEAなどのIDE環境をそろえるのが普通でした。他の言語での開発、特にスクリプト言語と比べると、たった1行のコードを実行するにも、実行までの手間がかかることが分かると思います。

 例えばJavaScriptなら、リスト1のコードを実行するだけで結果が確認できます。

リスト1 JavaScriptで"hello"という文字列を表示したい場合のコード例
console.log("hello");

 しかしJavaの場合は、リスト2の通り必ずmain文の中に処理を記述する必要があります。

リスト2 Javaで"hello"という文字列を表示したい場合のコード例
class Main {
  public static void main(String[] args) {
    System.out.println("hello");
  }
}

 この程度の違いであればいいですが、実際に学習が進むと、標準で提供されているAPIだけでなく、オープンソースなどで提供されているライブラリを使うようになります。実際の開発に近いレベルで学習するとなると他の環境に依存する割合が高いため、repl.itなどのサービスで対応することは難しくなるはずです。

 そこで、JavaはJShellというツールを標準で用意しました。JShellは学習目的に特化しているわけではなく、以下の用途で利用可能です。

  • Javaの学習目的
  • APIの動作確認や、記事やサイトなどのサンプルコードの動作確認
  • テスト

JShellの基本的な利用方法

 それでは、実際にJShellを使ってみましょう。jshellコマンドを実行すると、リスト3の通り表示されます。

リスト3 jshellコマンドを実行したときの実行結果例
$jshell
|  JShellへようこそ -- バージョン9
|  概要については、次を入力してください: /help intro

jshell>

 この状態は、すでにリスト4の(1)のmainメソッドの中にいるイメージです。ここから自分で好きなコードを記述していけばいいので、簡単に結果を確認できます。

 また、コードは順次実行していきます。その場で実行結果を表示でき、JShellという名前の通りShellコマンドを実行するように利用が可能です。

リスト4 jshellコマンドを実行した際のソースコードの関係のイメージ
class Main {
  public static void main(String[] args) {
    //  (1) ここにいるイメージ
  }
}

 それ以外にもJShell上でコードを確認する場合、これまでのJavaと同じコードを書く必要はなく、よりコードの確認がしやすいようになっています。

 その違いは以下のリスト5(Base64でのエンコード・デコードコード)を見るとわかります。

リスト5 Base64でのエンコード・デコードをするコードをJShellで実行したときの例
jshell> import java.util.Base64.*;
jshell> Base64.getEncoder();                // (1) 自動的に変数が定義される
$2 ==> java.util.Base64$Encoder@1ce92674
jshell> $2.encodeToString("hello world".getBytes());
$3 ==> "aGVsbG8gd29ybGQ="                   // (2) Stringオブジェクトの内容の表示
jshell> Base64.getDecoder();
$4 ==> java.util.Base64$Decoder@544fe44c
jshell> $4.decode($3.getBytes());
$5 ==> byte[11] { 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 }  // (3) byte[]型の表示
jshell> new String($5);
$6 ==> "hello world"
jshell> /exit  (4)終了
|  終了します

 通常のソースコードを書く場合と最も異なるのは、(1)のように変数を定義する必要はなく、自動的に${数値}のような変数が定義される点です。もちろん、自分で定義すればその変数名で定義が可能です。

 また、(2)や(3)のように、実行した際のオブジェクトの中身がわかりやすい形式で表示されます。そのためJShellでは、変数の内容を確認するためにSystem.out.printlnなどのメソッドを利用する必要はありません。このように逐次、実行状況やオブジェクトの状況が確認しやすくなっています。

 終了するときは(4)の通り/exitで終了します。

JShellでのコード記述をより便利するエディタ機能

 Javaのソースを記述する際は、テキストエディタではなくIDEを使うのが一般的でしょう。その理由の1つに、利用できるクラスやメソッドの自動補完機能やインラインヘルプ機能の存在があります。

 JShellでも同様に、タブキーを押すことでリスト6のように対象を表示してくれます。また、対象が1つのみの場合は自動的に残りの部分のコードも補完されます。さらに、メソッドの引数の説明なども表示することも可能です。

リスト6 JShell内でのコードヘルプ機能の実行例
jshell> Base64.[タブキー]
Decoder            Encoder            class              getDecoder()       getEncoder()       getMimeDecoder()   getMimeEncoder(    getUrlDecoder()    getUrlEncoder()
jshell> $4.[タブキー]
decode(       equals(       getClass()    hashCode()    notify()      notifyAll()   toString()    wait(         wrap(
jshell> Base64.getDecoder().decode([タブキー]
byte[] Base64.Decoder.decode(byte[] src)
Decodes all bytes from the input byte array using the Base64 encoding scheme, writing the
results into a newly-allocated output byte array.The returned byte array is of the length of
the resulting bytes.
// 以下省略

 なお、JShell内ではクラスを作成することなく、リスト7の通りメソッドも作成できます。作成したメソッドはJShell内でのグローバルなstaticメソッドとして定義されます。

リスト7 JShell内でのコードヘルプ機能の実行例
jshell> public String ts(Object obj){ return obj.toString(); }

 このような動作確認であれば、JShellのほうがIDEを用いるよりも簡単にできるはずです。

次のページ
コマンドの説明

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Java 9で「変わること」と、Javaのこれまで連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10619 2018/01/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング