2017-09-25 1 views
13

List.of()Collections.emptyList()間とSet.of()Collections.emptySet()Map.of()Collections.emptyMap()との違いは、ありますか?Map.of()()

+1

あなたが探しているの違いはどのような?メソッド名は異なりますが、結果として得られるデータ構造は非常によく似た動作をします。 –

+0

@ C-Ottoあなたが方法がちょうど「非常に似ている」(そして同一ではない)と主張するならば、明らかに違いがあると考える必要があります。 – jarnbjo

+0

@jarnbjo違いがあります - 私の答えを見てください – xenteros

答えて

17

はい、でも行動とがあるではないCollectionsクラスでemptyXyzファクトリメソッドから返されたコレクションとJDK 9とのインタフェース(MapListSet)で導入された新しいofファクトリメソッドの間だけの技術的な違いこれらが引数なしで呼び出された場合。

関連差は(ListSet及びMapインタフェースでAPIドキュメントで指摘したように)新しいofファクトリメソッドによって返されたコレクションはnullキーと値を許可しないことです。これは空のコレクションには関係ないと思われるかもしれませんが、たとえそれが明確に文書化されていなくても、新しいコレクション実装のアクセサメソッドでもnull値がチェックされます。

違いのいくつかの例:List.of().contains(null)NullPointerExceptionをスローする一方

Collections.emptyList().contains(null)は、falseを返します。

Collection.emptyMap().getOrDefault(null, V)は、Vを返します。Map.of().getOrDefault(null, V)は、NullPointerExceptionです。

現在、OracleのJDK 9で実装されているように、新しいファクトリメソッドによって返されるコレクションの次のメソッドは、少なくともNullPointerExceptionをスローしますが、コレクションクラスが最初に設計され、サポートするように指定されたCollectionsクラスの古いファクトリメソッドを使用してnullキーと値):

  • List.of().contains(null);
  • Set.of().contains(null);
  • Map.of().containsKey(null);
  • Map.of().containsValue(null);
  • Map.of().getOrDefault(null, <any>);
+0

+1これは良いことです。おそらく、APIドキュメントで指摘されているように注意を引く場合、すべてのコレクションタイプにセクションを指定してください:*これらのインスタンスのプロパティが説明されている* "Immutable 静的ファクトリメソッド" *。 – slim

+0

また、「sanely」は議論の余地があります - NPEは間違いなくもっと正常ですが、下位互換性はありません。 – slim

+5

@slimここでは下位互換性の問題はありません。 'X.of()'メソッドは新しく、 'Collections.emptyX()'メソッドを直接置き換えるものではありません。既存のコードは古いJavaバージョンと同様に動作します。 – Jesper