Java 9のコレクションファクトリメソッドとは?条件と使い方をわかりやすく解説
Java 9で導入されたコレクションファクトリメソッド
Java 9では、Collections APIにファクトリメソッドが新しく追加されました。List.of()、Set.of()、Map.of()、Map.ofEntries()といった静的ファクトリメソッドを利用することで、イミュータブル(不変)なリスト・セット・マップを簡単に作成できます。従来のようにArrays.asList()やCollections.unmodifiableList()などを組み合わせて書く必要がなくなり、コードの行数を大幅に削減できるのが大きなメリットです。
コレクションファクトリメソッドの条件
これらのファクトリメソッドで生成されるコレクションには、以下のような条件・特性があります。
- 構造的に不変(structurally immutable)である。要素の追加・削除・置き換えはできない。
- null要素やnullキーを許可しない。nullを渡すとNullPointerExceptionが発生する。
- すべての要素がシリアライズ可能であれば、コレクション自体もシリアライズ可能である。
- 作成時に重複する要素やキーを拒否する。重複があるとIllegalArgumentExceptionがスローされる。
- セット要素の反復順序は未指定であり、将来のバージョンで変更される可能性がある。
- 値ベース(value-based)である。ファクトリは新しいインスタンスを作成してもよいし、既存のインスタンスを再利用してもよい。そのため、同一性(identity)に依存する操作――アイデンティティ・ハッシュコードや同期化など――は信頼性がなく、避けるべきとされている。
基本構文
List.of(elements...)
Set.of(elements...)
Map.of(k1, v1, k2, v2)使用例
次のサンプルコードでは、Set.of()を使ってイミュータブルなセットを作成し、後から要素を追加しようとした場合の動作を確認しています。
import java.util.Set;
public class CollectionsTest {
public static void main(String args[]) {
System.out.println("Java 9 Introduced a static factory method: of()");
Set<String> immutableCountrySet = Set.of("India", "England", "South Africa", "Australia");
System.out.println(immutableCountrySet);
try {
immutableCountrySet.add("Newzealand");
} catch(Exception e) {
System.out.println("Caught Exception, Adding Entry to Immutable Collection!");
}
}
}実行結果
Java 9 Introduced a static factory method: of()
[South Africa, India, Australia, England]
Caught Exception, Adding Entry to Immutable Collection!このように、Set.of()で作成したコレクションにadd()で要素を追加しようとすると、UnsupportedOperationExceptionがスローされます。これはコレクションが構造的に不変であることを示しており、意図しないデータ改変からプログラムを守るのに役立ちます。読み取り専用の定数的なデータを扱う場面では、Java 9以降のコレクションファクトリメソッドを積極的に活用するとよいでしょう。
-
Java 9における@Deprecatedアノテーションの改善点とは?新要素「since」「forRemoval」を徹底解説
@Deprecatedアノテーションとはクラス、メソッド、フィールドなど、プログラム内のあらゆる要素に付与できる@Deprecatedアノテーションは、「その要素はもはや使用すべきではない」ことを示すためのものです。要素が非推奨とされる主な理由は以下の通りです。使用すると危険であり、エラーを引き起こす可能性がある将来のバージョンで互換性がなくなる可能性がある将来のバージョンで削除される可能性があるより優れた、効率的な代替手段がすでに提供されているJava 9で追加された2つの新しい要素Java 9では、@DeprecatedアノテーションにsinceとforRemovalという2つの新しい属性
-
JavaのJTextPaneとJEditorPaneの違いとは?特徴と使い分けを解説
Swingでテキストを扱うコンポーネントとしてよく使われるのが JTextPane と JEditorPane の2つです。この2つは似た用途に見えますが、実は明確な違いがあります。JTextPane は JEditorPane を拡張したクラスであり、フォント、文字スタイル、色などのワープロ的な機能を提供します。高度なテキスト処理が必要な場合には、このクラスを使用するのが適しています。一方、JEditorPane は HTML や RTF コンテンツの表示・編集をサポートしており、独自の EditorKit を作成することで機能を拡張することも可能です。JTextPaneの特徴JTextPa