5

特定のメソッド A のすべての呼び出し元が別のメソッド B によってラップされるようにしたい Java プロジェクトで使用する共通ユーティリティに設計上の問題があります。今日私が書いたこのコードの一般的な形式は次のとおりです。 :

x.B(new Runnable() {
    y.A();
});

B によって実行されている runnable には任意のコードを含めることができ、A を複数回呼び出す可能性があるため、A への呼び出しを B に直接追加しても、このコード内の runnable を取り除くことはできません。また、A はサードパーティです。コードなので、変更することはできません。ランナブルが A への別のネストされた呼び出しで B を再度呼び出す可能性がありますが、今日は決して起こらないので、今のところそのケースを無視しても問題ありません。

いくつかのオプションが表示されます。

  1. A() throws BlahExceptionB がその例外の唯一のキャッチャーになるように宣言して作成します。実際にスローされる例外がないため、これは醜いですが、コンパイラーが呼び出し階層を保証してくれるので、これは素晴らしいことです。
  2. このルールを確実にするために、ある種の静的分析ツールを作成してください。このケースは、他の何よりも手間がかかるように思えるので、まだあまり調査していません (しかし、これを実行できる既存のツールがあるのではないでしょうか?)。
  3. B への呼び出し内で実行している「A の始まり」にアサーションを追加します (実際には、このコードは Runnble のカスタム バージョンに存在する必要があります。これは、A を直接変更できないためです)。追加のスレッド/オブジェクトローカル状態またはコールスタック自体をトラバースしますが、どちらも一種の醜いものです。

私が考慮していない他のオプションはありますか?

4

1 に答える 1