Java 9のJShellでSetインターフェースを実装する方法を解説
JShellは、Java 9に搭載されたコマンドラインツールです。式、クラス、インターフェース、メソッドなどの簡単なステートメントを対話形式で実行できるため、Javaのコードを手軽に試すことができます。
SetはJavaにおけるインターフェースの一つで、「重複しない要素(ユニークな要素)」を持つコレクションのための契約を定義しています。object1.equals(object2)がtrueを返す場合、object1とobject2のうち片方だけがSetの実装に格納されます。
以下のコードスニペットでは、Set.of()メソッドを使用します。Set.of()メソッドが返すコレクションはイミュータブル(不変)であるため、add()メソッドはサポートされていません。要素を追加しようとするとUnsupportedOperationExceptionがスローされます。代わりに、add()メソッドをサポートするHashSetを作成すれば、Setの「重複排除」の性質を確認できます。重複する"Adithya"を挿入しようとした際にfalseが返されることで、追加が失敗したことがわかります。
スニペット1:Set.of()によるイミュータブルなSet
jshell> Set<String> set = Set.of("Adithya", "Chaitanya", "Jai");
set ==> [Jai, Adithya, Chaitanya]
jshell> set.add("Adithya");
| java.lang.UnsupportedOperationException thrown:
jshell> Set<String> hashSet = new HashSet<>(set);
hashSet ==> [Chaitanya, Jai, Adithya]
jshell> hashSet.add("Adithya");
$8 ==> false
jshell> hashSet
hashSet ==> [Chaitanya, Jai, Adithya]
次のコードスニペットでは、HashSetを実装しています。HashSetでは、要素は挿入順にもソート順にも保存されません。要素の順序は保証されない点に注意してください。
スニペット2:HashSet(順序なし)
jshell> Set<Integer> numbers = new HashSet<>();
numbers ==> []
jshell> numbers.add(12345);
$11 ==> true
jshell> numbers.add(1234);
$12 ==> true
jshell> numbers.add(123);
$13 ==> true
jshell> numbers.add(12);
$14 ==> true
jshell> numbers
numbers ==> [1234, 12345, 123, 12]
次のコードスニペットでは、LinkedHashSetを実装しています。LinkedHashSetでは、要素が挿入順に保存されます。後から追加した要素も、リストの末尾に追加されていくのが確認できます。
スニペット3:LinkedHashSet(挿入順)
jshell> Set<Integer> numbers1 = new LinkedHashSet<>();
numbers1 ==> []
jshell> numbers1.add(12345);
$17 ==> true
jshell> numbers1.add(1234);
$18 ==> true
jshell> numbers1.add(123);
$19 ==> true
jshell> numbers1.add(12);
$20 ==> true
jshell> numbers1
numbers1 ==> [12345, 1234, 123, 12]
jshell> numbers1.add(123456);
$22 ==> true
jshell> numbers1
numbers1 ==> [12345, 1234, 123, 12, 123456]
最後のコードスニペットでは、TreeSetを実装しています。TreeSetでは、要素がソートされた順序で保存されます。数値の場合は昇順に自動的に並び替えられるため、順序付きのコレクションが必要な場面で便利です。
スニペット4:TreeSet(ソート順)
jshell> Set<Integer> numbers2 = new TreeSet<>();
numbers2 ==> []
jshell> numbers2.add(12345);
$25 ==> true
jshell> numbers2.add(1234);
$26 ==> true
jshell> numbers2.add(123);
$27 ==> true
jshell> numbers2.add(12);
$28 ==> true
jshell> numbers2
numbers2 ==> [12, 123, 1234, 12345]
jshell> numbers2.add(123456);
$30 ==> true
jshell> numbers2
numbers2 ==> [12, 123, 1234, 12345, 123456]
このように、JShellを使えば各Set実装クラスの特徴(イミュータブルかどうか、要素の順序など)を対話的に素早く確認できます。用途に応じて、Set.of()(変更不可)、HashSet(順序なし・高速)、LinkedHashSet(挿入順)、TreeSet(ソート順)を使い分けるとよいでしょう。
-
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の匿名内部クラスでインターフェースを実装する方法をわかりやすく解説
匿名内部クラス(Anonymous Inner Class)とは、クラス名を持たないクラスのことであり、インスタンス化するその場で直接定義できるのが特徴です。インターフェースの実装を一時的に行いたい場合や、コードを簡潔にまとめたい場合に非常に便利な手法です。匿名内部クラスの基本通常、インターフェースを実装するには、別途クラスを定義して implements キーワードを使用します。しかし匿名内部クラスを使えば、new インターフェース名() { ... } の形式で、インスタンス生成と同時にメソッドの実装を記述できます。実装例次のプログラムでは、TutorialsPoint インターフェースの