最近Guava
Optional
、メソッドでのオプションのパラメーターの使用についてチームメートと話し合いました。
メソッドが
List<Book> getBooks(String catalogId, Optional<String> categoryId) {
Validate.notNull(catalogId);
Validate.notNull(categoryId); // Point of conflict. Is this required?
これは、catalogId
とそのカタログにリストされている本を返すオプション を受け入れ、categoryId
カテゴリも渡された場合、そのカテゴリの本のみを返します。
競合のポイントは、Optional<String> categoryId
nullチェックの検証でした。これはオプションのパラメータであるため、nullチェックを行うべきではないと私は考えていました。関数の呼び出し元は、null
またはOptional.<String>absent()
を渡すことができます。getBooks
関数はif(categoryId==null && categoryId.isPresent())
、実装で実行することにより、両方のケースを処理する必要があります。
私の意見では、Optional
オプションのパラメーターの場合、メソッドの契約がより明確になります。メソッドシグネチャを見るだけで、このパラメータはオプションであり、javadocsを読む必要がないことがわかります。ただし、Optional.absent()
そのオプションのパラメーターを使用したくない場合は、強制的に合格させるべきではありません。
私のチームメイトは別の見方をしていました。彼はそれに対してnullチェックを入れたかったので、呼び出し元に常に合格を強制しましたOptional.<String>absent()
。彼のポイントは、なぜnullオプションを渡すのかということでした。さらに、getBooks("catalog123", Optional.absent())
より読みやすく見えますgetBooks("catalog123", null)
。
このメソッドは、ライブラリパッケージの1つに含まれており、所有する複数のパッケージで使用されます。
Optional
このシナリオの使用法についてのあなたの提案は何ですか?
ありがとう
このシナリオでのオプションの使用に関する提案は何ですか?
避ける。避ける。避ける。
一方ではOptional
あるクールな代替するnull
、Javaであなたはいつもそれがあることになってしまいます悪い加え代わりに。Seelenvirtuoseが書いたように、2つだけが必要な3つの可能性があります。JB Nizetが書いたように、必要なチェックを呼び出し元に思い出させる戻り値として使用するのが最適です。メソッドの引数としては、何の役にも立ちません。
理想的には、オプションの引数は次のようにオプションです。
getBooks(String catalogId, String categoryId = null)
これは有効なJavaではありません。AFAIK C ++コンパイラはそれを2つのメソッドに変換します
getBooks(String catalogId, String categoryId)
getBooks(String catalogId)
これは、Javaで自分で作成する必要があるものです。パラメータを除外することは、それがオプションであることを明確にする最も明確な方法です。オプションの引数をとしてマークするのも@Nullable
ほぼ同じです。nullabilityチェックツールを使用すると、NPE(の主な引数Optional
)を回避するのに役立ちます。
重要なのは一貫性です。クラス間の一貫性はあなたの手の中にあります。JDKとの整合性とnull
は、少なくとも当面の間、を使用することを意味します(いつか、JDK 8Optional
が普及する可能性があります)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加