前回からProject Kullaを紹介しています。簡単におさらいしておきましょう。Project Kullaでは、JavaのREPLツールであるJShellを提供しています。JShellを使用すれば、クラスを定義せずとも、Javaのコードを行単位で実行できます。JShellで実行するコードは、Javaコードの断片ということで、スニペットと呼ばれています。

 今回は、さらにJShellの使い方を紹介していきます。

メソッド・クラスの定義

 前回は変数の定義や、クラス、メソッドを使用するスニペットを例にしてきました。JShellではそれだけでなく、メソッドやクラスを定義できます。しかも、変数と同様に、クラスを作成しなくてもメソッドの定義ができます。

 ここでは、例として階乗を計算するメソッドを定義してみましょう。

jshell> long fractorial(long x) {
   ...>   return LongStream.rangeClosed(1, x).
   ...>                     reduce(1, (s, t) -> s * t);
   ...> }
|  次を作成しました: メソッド fractorial(long)

jshell>

 メソッドも1行で定義しますが、前回紹介したように文の途中で改行した場合、次行に続けて記述することができます。階乗は、LongStreamインタフェースのreduceメソッドを使用して計算しています。

 fractorialメソッドは定義できたので、さっそく使ってみましょう。

jshell> long f = fractorial(10)
f ==> 3628800

jshell> System.out.println(f)
3628800

jshell>

 fractrialメソッドは、単にメソッドをコールするだけで使用できます。Javaではインスタンスメソッドであればオブジェクト、クラスメソッドであればクラスが必要だったことに比べると、JShellでのメソッドの定義はちょっと違和感がありますね。

 しかし、簡単にメソッドを定義でき、使うのも容易であるので、ちょっと試すには便利です。

 同じように、クラスを定義できます。ここでは、複素数を表すComplexクラスを作ってみましょう。

jshell> class Complex {
   ...> double r; double i;
   ...> Complex(double r, double i) { this.r = r; this.i = i; }
   ...> Complex add(Complex x) { return new Complex(r+x.r, i+x.i); }
   ...> Complex multi(Complex x) { return new Complex(r*x.r - i*x.i, r*x.i + i*x.r); }
   ...> public String toString() { return r + "+" + i + "i"; }
   ...> }
|  次を作成しました: クラス Complex

jshell>

 複素数は実数部と虚数部を持つ数です。Complexクラスでは実数をフィールドr、虚数をフィールドiで表しています。このクラスはJShell内だけで使用するので、デフォルトのスコープで定義しています。

 toStringメソッドだけは、ObjectクラスのtoStringクラスをオーバーライドしているので、publicで定義しました。

 さて、定義はできたので、Complexクラスを使用してみましょう。

jshell> Complex x = new Complex(1, 2)
x ==> 1.0+2.0i

jshell> Complex y = new Complex(2, 2)
y ==> 2.0+2.0i

jshell> Complex s = x.add(y)
s ==> 3.0+4.0i

jshell> Complex t = x.multi(y)
t ==> -2.0+6.0i

jshell>

 JShellで定義したクラスでも、普通のクラスのように使用できました。

この先は会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら