はList.of()
とCollections.emptyList()
間とSet.of()
とCollections.emptySet()
間Map.of()
とCollections.emptyMap()
との違いは、ありますか?Map.of()()
答えて
はい、でも行動とがあるではないCollections
クラスでemptyXyz
ファクトリメソッドから返されたコレクションとJDK 9とのインタフェース(Map
、List
、Set
)で導入された新しいof
ファクトリメソッドの間だけの技術的な違いこれらが引数なしで呼び出された場合。
関連差は(List、Set及び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>);
+1これは良いことです。おそらく、APIドキュメントで指摘されているように注意を引く場合、すべてのコレクションタイプにセクションを指定してください:*これらのインスタンスのプロパティが説明されている* "Immutable
また、「sanely」は議論の余地があります - NPEは間違いなくもっと正常ですが、下位互換性はありません。 – slim
@slimここでは下位互換性の問題はありません。 'X.of()'メソッドは新しく、 'Collections.emptyX()'メソッドを直接置き換えるものではありません。既存のコードは古いJavaバージョンと同様に動作します。 – Jesper
あなたが探しているの違いはどのような?メソッド名は異なりますが、結果として得られるデータ構造は非常によく似た動作をします。 –
@ C-Ottoあなたが方法がちょうど「非常に似ている」(そして同一ではない)と主張するならば、明らかに違いがあると考える必要があります。 – jarnbjo
@jarnbjo違いがあります - 私の答えを見てください – xenteros