Java 9のJShellで文字列ユーティリティと不変性を実装・確認する方法
JShellとは?
JShellはJava 9で導入された対話型のコマンドラインツールです。式、クラス、メソッド、フィールド、インターフェースなどの簡単なステートメントをその場で入力・実行できるため、学習や動作検証に非常に便利です。また、Stringクラスは標準ライブラリのjava.langパッケージに含まれており、日常的なテキスト処理を行うための多彩なメソッドを提供しています。
本記事では、JShellを使った文字列ユーティリティの活用方法と、Stringクラス特有の「不変性(イミュータブル性)」について、実際の実行例を交えて解説します。
1) 文字列ユーティリティメソッド
Stringクラスには数多くの組み込みユーティリティメソッドが用意されています。代表的なものとして、indexOf()、lastIndexOf()、charAt()、contains()、startsWith()、endsWith()、isEmpty()、equals()、equalsIgnoreCase()などが挙げられます。
以下のコードスニペットでは、JShell上でこれらの文字列ユーティリティメソッドを実際に実行した結果を確認できます。
サンプルコード1:文字列の検索・比較
jshell> String str = "JShell is a new feature in Java9";
str ==> "JShell is a new feature in Java9"
jshell> str.indexOf("new")
$4 ==> 12
jshell> str.charAt(7)
$5 ==> 'i'
jshell> str.indexOf('i')
$6 ==> 7
jshell> str.lastIndexOf('i')
$7 ==> 24
jshell> str.contains("feature")
$8 ==> true
jshell> str.startsWith("JShell")
$9 ==> true
jshell> str.startsWith("Java9")
$10 ==> false
jshell> str.endsWith("Java9")
$11 ==> true
jshell> str.endsWith("a9")
$12 ==> true
jshell> str.endsWith("a9java")
$13 ==> false
jshell> String str1 = "value"
str1 ==> "value"
jshell> str1.equals("value")
$15 ==> true
jshell> str1.equals("VALUE")
$16 ==> false
jshell> str1.equalsIgnoreCase("VALUE")
$17 ==> true
このように、indexOf()は指定した文字や文字列が最初に現れる位置を返し、lastIndexOf()は最後に現れる位置を返します。また、equals()は大文字・小文字を区別して比較するのに対し、equalsIgnoreCase()は大文字・小文字を無視して比較する点に注目してください。
2) 文字列の不変性(イミュータブル性)
Stringオブジェクトは不変(immutable)です。つまり、一度生成された文字列の値は、後から変更することができません。
次のコードスニペットでは、Stringクラスのconcat()メソッドを使って2つの文字列を連結しています。しかし、元の変数「str」が参照している値は変化していません。これは、concat()メソッドが元の文字列を書き換えるのではなく、新しいStringオブジェクトを生成して返すためです。同様に、toUpperCase()、toLowerCase()、trim()といった他のStringメソッドも、すべて新しいStringオブジェクトを返します。
サンプルコード2:不変性の挙動を確認
jshell> String str = "Tutorialspoint";
str ==> "Tutorialspoint"
jshell> str.concat(" is e-learning app");
$3 ==> "Tutorialspoint is e-learning app"
jshell> str
str ==> "Tutorialspoint"
jshell> String str1 = str.concat(".")
str1 ==> "Tutorialspoint."
jshell> str1
str1 ==> "Tutorialspoint."
jshell> String str = str.concat(" is e-learning app");
str ==> "Tutorialspoint is e-learning app"
jshell> str
str ==> "Tutorialspoint is e-learning app"
jshell> String str1 = "Tutorialspoint";
str1 ==> "Tutorialspoint"
jshell> str1.concat(" is e-learning app");
$2 ==> "Tutorialspoint is e-learning app"
jshell> str1
str1 ==> "Tutorialspoint"
jshell> String str2 = str1.concat(" is e-learning app");
str2 ==> "Tutorialspoint is e-learning app"
jshell> str1
str1 ==> "Tutorialspoint"
jshell> String str3 = str2.concat(".");
str3 ==> "Tutorialspoint is e-learning app."
jshell> str1
str1 ==> "Tutorialspoint"
jshell> str2
str2 ==> "Tutorialspoint is e-learning app"
jshell> String s = "Tutorialspoint is e-learning app."
s ==> "Tutorialspoint is e-learning app."
jshell> s.toUpperCase()
$10 ==> "TUTORIALSPOINT IS E-LEARNING APP."
jshell> s.toLowerCase()
$11 ==> "tutorialspoint is e-learning app."
出力結果を見ると分かる通り、str1.concat(...)を呼び出しても、元のstr1の値は「Tutorialspoint」のまま一切変わっていません。連結結果を保持したい場合は、戻り値を別の変数(または同じ変数)に代入し直す必要があります。この仕組みにより、文字列は安全に共有・再利用できるようになっています。
まとめ
JShellを活用すれば、Stringクラスの各種ユーティリティメソッドや不変性の挙動を、コンパイル不要で手軽に確認できます。文字列操作の学習や仕様の検証の際に、ぜひJShellを試してみてください。
-
Java 9でJavaFXを使ってJShellをプログラムから実装する方法
JShellは、サンプル式を対話的に実行できるツールです。通常はコマンドラインから利用しますが、JavaFXアプリケーションの中でプログラム的にJShellを実装することも可能です。その場合、Javaプログラムに以下のパッケージをインポートする必要があります。import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; import jdk.jshell.VarSnippet;これらのクラスの役割は次のとおりです。JShell:評価エンジンの本体。式や文を評価(eval)するためのAPIを提供します。SnippetEvent:評価結果として
-
Java 9のJShellでスニペットを保存・編集・削除する方法
Java Shell、通称JShellは、Java 9で正式に導入された公式のREPL(Read-Evaluate-Print-Loop)ツールです。対話型シェルを提供し、main()メソッドを作成したり、コードを実行前にコンパイルしたりすることなく、迅速なプロトタイピングやデバッグを行うことができます。JShellは、コマンドプロンプトで「jshell」と入力するだけで簡単に起動できます。この記事では、JShellで作成したスニペット(コード断片)を保存、編集、削除する方法を解説します。スニペットを保存する(/save)スニペットのソースコードをファイルに保存するには、「/save [-al