web-dev-qa-db-ja.com

引数が必要な場合と不要な場合がある場合に、メソッドの引数としてOptionalを使用しない理由はありますか?

Java 8を使用すると、オプション/オプションの使用に関する記事がますます増えています。それらが何を表しているのか理解しており、それらがリターンとして使用されている多くの例を見ています。しかし、デフォルト/オプションのパラメーターの構文を持たない言語でメソッド/関数の引数として使用されているのはわかりません。

引数が必要かどうかにかかわらず、メソッド引数としてOptionalを使用しない理由はありますか?これが私が考えられる例です:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)
11
Nicholas

1つの理由は、概念的には、firstNamemiddleName、およびlastNameは論理的にone引数であり、3つではないことです。それらはすべて、より大きな全体の一部であり、ほとんど常に一緒に渡されると想像することができます。関数型言語では、タプルまたはレコードとして渡される可能性があります。 Javaはこれらを欠いているため、おそらくNameクラスに集約されます。フルネームを受け取って返す関数を作成する必要がある場合は、それらを集約しないと作成できないことに注意してください。 -結局のところ、返せる値は1つだけです。

おそらく、値がオプションであり、大きな全体の一部ではないことはあまりありません。関数requiresが特定の値を処理する場合、その関数はOptionalを受け入れません。値を返さない可能性のある操作をチェーンする必要がある場合、途中でいずれかの関数が失敗した場合にNothingで中止し、flatMapへの呼び出しをチェーンして、例外で失敗したい場合途中で、またはチェーンの最後でget()を使用できます。

値が本当にオプションであり、関数がその存在または不在に基づいて2つの異なることを行う場合、その関数は、それぞれが1つのことを行う2つの小さな関数のラッパーでなく、特定の決定の組み合わせが非常に一般的でない限り、コードのにおいです。

あまり一般的でないユースケースであるため、それが間違っているほど多くはないと思います。

6
Doval

デフォルトの引数をサポートしない言語はそれほど多くないため、これは一般的な使用法ではありません。私は個人的にあなたの使用法はひどくないと思いますが、それは慣用的なJavaにはなりません。 Java非常に意図的にデフォルトの引数がないため、代わりにオーバーロードを強制的に使用します。これは、関数内にifステートメントを要求する代わりにコンパイラが引数をチェックするという利点があります。

つまり、2つの異なるバージョンのクエリを作成することになります。1つはミドルネーム付き、もう1つはミドルネームなしです。簡潔にそれを行うことができる場合は、オプションを使用することをお勧めします。とにかく2つの個別の関数で必要とするほど冗長な場合は、オーバーロードを使用して慣用的にすることもできます。

5
Karl Bielefeldt