無駄かもしれない足掻き

github : https://github.com/zer0-u

2つの空リスト

個人的にコードを書いていて気になったところのメモ。

戻り値がListのメソッドに対して、何らかの例外が発生しても空のリストを返したいなーと思ったとする。

そういう時は、単純に自分で中身のないリストを作って返すこともできる。 だが、同じようなことを考える人はそれなりにいるようで、Collectionsクラスに専用の変数とメソッドが用意されているわけだ。これを使わない手はない。

ただ、初めてこれを使おうと思うと、選択肢が2つあることに気が付いて若干混乱する。

  • Collections.EMPTY_LIST
  • Collections#emptyList()

この2つは何が違うのかを調べてみた。

Collections.EMPTY_LIST

Java Platform SE 8を見ると、

空のリストです(不変)。このリストは直列化可能です。

とある。直列化はまだよくわからないけれど、まぁ名前の通り空のリストを表しているようだ。

次に、コードを見てみると

public static final List EMPTY_LIST = new EmptyList<>();

とある。EmptyListというクラスがあるらしい。このクラスについては長いので引用しないけれど、サイズが0でisEmptyメソッドが常にtrueを返すらしいことはわかる。

どうやら、Collections.EMPTY_LISTは中身のないリストを定数として宣言したようなものらしい。

Collections#emptyList()

同じくJava Platform SE 8を見ると、

空のリストです(不変)。このリストは直列化可能です。

とある。ここまではEMPTY_LISTと変わらない。ただ、この後を読んでいくと、

このメソッドとは異なり、フィールドは型保証しない。

とある。型が関連しているらしい。

コードを見てみると、

public static final <T> List<T> emptyList() {
        return (List<T>) EMPTY_LIST;
    }

となっている。変数のEMPTY_LISTを返すのは同じだけど、型キャストがされている。

ということは

戻り値のListの中身の型が決まっているなら、Collections#emptyList()を使った方がよいということだろうか。

今回はString型のListを返すって決まっていたからメソッドにしたけれど、となると変数の方はどうやって使うんだろうか。

もうちょっと調査が必要である。