web-dev-qa-db-ja.com

変更不可能なリストを返すメソッド

Javaでは、return Collections.unmodifiableList(list)を実行して、呼び出し元が変更できないリストを返すことができます。

メソッド名は、変更不可能なリストを返すことを示す必要がありますか?これにより、私のクラスのクライアントがリストにオブジェクトを追加したり、リストからオブジェクトを削除したりできなくなります。

4
user4205580

unmodifiableList()メソッドshouldは、変更できないことを明確にする新しい型を返しました。これが行われなかった理由についての議論は、 この質問 を参照してください。

現状のまま、この制限を明確にする必要があります。通常、メソッドのAPIドキュメントでこれを言及するだけで十分です。特に、ドメインから挿入または削除が機能しない可能性があることが明らかな場合(findCountries()は、技術的にはadd()メソッドを使用してオブジェクトを返します)。

ドメインがそれほど明確でない場合は、メソッド名を使用して制限をさらに明確にすることをお勧めします。たとえば、supportedFlavors()メソッドがある場合、リストを操作してサポートされているフレーバーを変更できると考えるのはまったく不合理ではありません。名前を使用して警告を追加することをお勧めします。

4
Kilian Foth

メソッドが単にListを返すことを知らないので、私の最初の反応は次のとおりです。

いいえ、メソッド名は、問題のドメインに関してメソッドが何をするかを反映する必要があります。現在、メソッド(またはオブジェクト)の名前に型情報を追加する理由はわかりません。戻り値の型は、適切なIDEで簡単に表示できるはずです。

これは、人々がほとんど単純なテキストエディタでコードを読んだり、紙に印刷したりしたときとは異なる方法でした。この頃、ハンガリー記法のような命名規則は実際に理にかなっています。

これは、呼び出し元の関数で返されるオブジェクトの名前にも当てはまります。

さて、Collections.unmodifiableList(list)が実際に何をするかを学んだので、メソッド名reallyを明らかにする必要がありますandオブジェクト名に。

しかし、何よりも、私はこの方法をまったく使用しないようにします。チェックが実行時にのみ実行されることは非常に危険だと思います。

4
Frank Puffer

Collection<? extends ElementType>の代わりにCollection<ElementType>を返すことでこれを文書化することがあります。この方法では、要素の追加は明らかにサポートされていません。したがって、サポートされていないことを削除することは暗黙に含まれます。あなたはそれをより明示的にするかもしれません

  • 公開APIです
  • インターフェイスのクライアントがソースをすぐに利用できない
  • ドメインは明らかではありません
2
Jaap

あなたが書いた:

メソッド名は、変更不可能なリストを返すことを示す必要がありますか?これにより、私のクラスのクライアントがリストにオブジェクトを追加したり、リストからオブジェクトを削除したりできなくなります。

いいえ。あなたのinterfaceは読み取り専用の性質を強制する必要があります(そして、余談ですが、返されたオブジェクトが不変であるかどうか、またはクライアントがそれを検査または保持している間に変更できるかどうかを決定する必要があります。すなわち防御的コピーここで有効な目標ですか?).

2
Brian Agnew