オプションパラメータのメソッド引数としてGuavaオプション

任意の質問

最近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> categoryIdnullチェックの検証でした。これはオプションのパラメータであるため、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このシナリオの使用法についてのあなたの提案は何ですか?

ありがとう

maaartinus

このシナリオでのオプションの使用に関する提案は何ですか?

避ける。避ける。避ける。

一方では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]

編集
0

コメントを追加

0

関連記事

分類Dev

メソッドを呼び出すときにオプションの引数としてディクショナリパラメータを使用する

分類Dev

クラスをオプションのパラメータとしてメソッドに渡す方法は?

分類Dev

オプションの引数をスキップしてパラメータパックを埋める

分類Dev

オプションで、可変個引数テンプレートパラメータに基づいてメソッドを公開します

分類Dev

オプションの(!)関数パラメーターとしてのstd :: ostream

分類Dev

オプションのパラメータを使用しないメソッドのオーバーロード

分類Dev

オプションのパラメーターを持つメソッド

分類Dev

オプションのパラメーターを持つメソッド

分類Dev

Java8でオプションのパラメータを使用してメソッドを呼び出す

分類Dev

React / Javascript:オプションのパラメーターをプロップとして関数を渡す

分類Dev

クエリメソッドのSpringDataオプションパラメータ

分類Dev

オプションのパラメータをメソッドに渡す

分類Dev

PHP:オプションのリストを引数として送信する(名前付きパラメーター/引数バッグの代わりに)

分類Dev

Javaメソッド引数のオプション?

分類Dev

プロトコル内のオプションのメソッドでパラメーターとして列挙型を渡す方法

分類Dev

オプションのパラメーターによるメソッドのオーバーロード

分類Dev

コマンドライン引数の質問-オプションの関数パラメーターをスキップしますか?

分類Dev

c#仮想メソッドとオーバーライドされたメソッドのオプションのパラメーター

分類Dev

オプションのパラメータのないあいまいなメソッド呼び出し

分類Dev

オプションのメソッド引数を設定しますか?

分類Dev

タイプの昇格とメソッドのオーバーロード(複数のオプション)

分類Dev

コールバックとしてコントローラーメソッドを使用するSlim3オプションパラメーター

分類Dev

オプションのパラメータを使用してパイプタプルをメソッドに転送する

分類Dev

オプションに基づいて異なるメソッドを返すクラスのパターン?

分類Dev

Spring MVCでセッション属性をメソッド引数(パラメーター)として渡す方法

分類Dev

Javascript-オブジェクトとしてオプションのパラメータを持つ関数?

分類Dev

オプションの最初のハッシュパラメーターとkeyword_argsを使用した奇妙なメソッドの動作

分類Dev

オプション付き/オプションなしのBASHスクリプトとパラメーター

分類Dev

オプションのjavascript関数パラメーターとしての複雑なデータ

Related 関連記事

  1. 1

    メソッドを呼び出すときにオプションの引数としてディクショナリパラメータを使用する

  2. 2

    クラスをオプションのパラメータとしてメソッドに渡す方法は?

  3. 3

    オプションの引数をスキップしてパラメータパックを埋める

  4. 4

    オプションで、可変個引数テンプレートパラメータに基づいてメソッドを公開します

  5. 5

    オプションの(!)関数パラメーターとしてのstd :: ostream

  6. 6

    オプションのパラメータを使用しないメソッドのオーバーロード

  7. 7

    オプションのパラメーターを持つメソッド

  8. 8

    オプションのパラメーターを持つメソッド

  9. 9

    Java8でオプションのパラメータを使用してメソッドを呼び出す

  10. 10

    React / Javascript:オプションのパラメーターをプロップとして関数を渡す

  11. 11

    クエリメソッドのSpringDataオプションパラメータ

  12. 12

    オプションのパラメータをメソッドに渡す

  13. 13

    PHP:オプションのリストを引数として送信する(名前付きパラメーター/引数バッグの代わりに)

  14. 14

    Javaメソッド引数のオプション?

  15. 15

    プロトコル内のオプションのメソッドでパラメーターとして列挙型を渡す方法

  16. 16

    オプションのパラメーターによるメソッドのオーバーロード

  17. 17

    コマンドライン引数の質問-オプションの関数パラメーターをスキップしますか?

  18. 18

    c#仮想メソッドとオーバーライドされたメソッドのオプションのパラメーター

  19. 19

    オプションのパラメータのないあいまいなメソッド呼び出し

  20. 20

    オプションのメソッド引数を設定しますか?

  21. 21

    タイプの昇格とメソッドのオーバーロード(複数のオプション)

  22. 22

    コールバックとしてコントローラーメソッドを使用するSlim3オプションパラメーター

  23. 23

    オプションのパラメータを使用してパイプタプルをメソッドに転送する

  24. 24

    オプションに基づいて異なるメソッドを返すクラスのパターン?

  25. 25

    Spring MVCでセッション属性をメソッド引数(パラメーター)として渡す方法

  26. 26

    Javascript-オブジェクトとしてオプションのパラメータを持つ関数?

  27. 27

    オプションの最初のハッシュパラメーターとkeyword_argsを使用した奇妙なメソッドの動作

  28. 28

    オプション付き/オプションなしのBASHスクリプトとパラメーター

  29. 29

    オプションのjavascript関数パラメーターとしての複雑なデータ

ホットタグ

アーカイブ