62

を返す非同期メソッドを書きたいと思いますCompletableFuture。future の唯一の目的は、結果ではなく、メソッドがいつ完了するかを追跡することです。戻った方がいいですかCompletableFuture<Void>、それともCompletableFuture<?>?どちらか一方を好む理由はありますか、それとも交換可能ですか?

パラメーター リスト、変数宣言、またはその他のコンテキストではなく、戻り値の型についてのみ質問していることに注意してください。

4

4 に答える 4

18

CompletableFuture<Void> または CompletableFuture<?> を返す方が良いでしょうか?

どちらか一方を好む理由はありますか、それとも交換可能ですか?

コードが影響を与える可能性があるコンテキストは 3 つあります。

  • ランタイム - ジェネリックには影響はありません。
  • Future<Void>Compile - 一部のメソッドが を受け入れても受け入れないというケースは想像できませんFuture<?>
  • 開発 -Futureの結果に意味がない場合は、宣言を通じてユーザーにそのことを伝えることをお勧めします。

Future<Void>より好ましいです。

于 2015-12-11T22:46:00.567 に答える
7

適切な型は、そのセマンティクスによって異なります。リストされているすべてのオプションは、完了を通知することを約束し、非同期的に例外を返す場合があります。

  • CompletableFuture<Void>:Void期待する結果がないことをユーザーに伝えます。
  • CompletableFuture<?>これ?は、任意の値を配信できるという意味で、contains 値の型が定義されていないことを意味します。

このCompletableFutureクラスは、 からいくつかの便利なメソッドを継承していCompletionStageます。ただし、メソッドの呼び出し元が未来の完了をトリガーすることもできます。これは、メソッドが完了自体を通知する責任があるため、間違っているようです。実行をキャンセルしないためcancel(...)、デフォルトの実装ではかなり無意味なメソッドもあります。CompletableFuture

  • Future<Void>:Void期待する結果がないことをユーザーに伝えます。
  • Future<?>これ?は、任意の値を配信できるという意味で、contains 値の型が定義されていないことを意味します。

Futureの便利なメソッドがありませんCompletionStage。フューチャーの完了をトリガーすることはできませんが、実行はキャンセルできます。

次のオプションは次のCompletionStage<Void>とおりです。

  • CompletionStage<Void>:Void期待する結果がないことをユーザーに伝えます。ハンドラーをバインドする便利なメソッドは存在しますが、cancel(...)メソッドはありません。メソッドの呼び出し元は、の完了をトリガーできませんCompletionStage
  • <CancellableFuture extends Future<Void> & CompletionStage<Void>>Future<Void>:およびからのメソッドのセットCompletionStage<Void>。結果がないこと、便利なメソッドが存在すること、およびキャンセルするオプションがあることを示しています。メソッドの呼び出し元は、の完了をトリガーできませんCompletionStage

メソッドの不在は、cancel(...)シナリオに適合するかどうかに関係なく可能性があります。したがって、CompletionStage<Void>キャンセルが必要ない場合は使用<CancellableFuture extends Future<Void> & CompletionStage<Void>>し、実行をキャンセルするオプションが必要な場合は使用することをお勧めします。選択した場合は、メソッド宣言に long 型の共通部分を直接配置するのではなく、継承して戻り値の型として使用<CancellableFuture extends Future<Void> & CompletionStage<Void>>するインターフェイスを自分で作成することをお勧めします。Future<Void>CompletionStage<Void>

CompletableFuture呼び出し元が Future の完了をトリガーする可能性があるため、宣言された戻り値の型で戻ることは避ける必要があります。故意にこれを行うと、コードが混乱し、予期せぬハングが発生します。これは、どのコードが完了をトリガーするかが明確でなくなるためです。上記のより制限された型のいずれかを使用して、型システムがメソッドの呼び出し元による意図しない完了のトリガーを防止できるようにします。

于 2016-11-26T00:50:05.550 に答える