0

同じクラスの 2 つの異なる場所から呼び出したいメソッドがあります。1 つは通常どおりダイアログを呼び出し、もう 1 つは無効なフィールドを持つダイアログを呼び出します。

呼び出しでフラグを渡し、メソッド内でテストを行うことはわかっていますが、より最適化された方法はありますか? 呼び出しがどこで発生したかをメソッド内で知る方法はありますか?

編集:

   // The part where you call the method passing a flag.
   showItemCustomDialog(true);
   showItemCustomDialog(false);

   // The dialog
   public void showItemCustomDialog(boolean flag) { 
       customDialog = new Dialog(this));
       field.setEnabled(flag);
   }

それは良い例ですか?

4

4 に答える 4

2

パラメータ化された方法でうまくいくと思います。なぜそれが最適ではないと言っているのですか?メソッドがどこから呼び出されたかを確認する方法はありますが、これは非常に醜いので、これを行う方法を示したくありません。

于 2012-09-26T14:42:33.807 に答える
1

最終的には、フィールドを無効にする必要があるかどうかを知るために何らかのテストを行う必要があり、boolean値をテストするため、それを取得する最も簡単な方法booleanは単純に渡すことです。プリミティブ、オブジェクトなど、あらゆる種類のパラメーターの受け渡しは比較的安価であるため、パフォーマンスに関しては、実際には問題はありません。

設計の観点からは、パラメーターを使用することは理にかなっています。これは実際にboolean値の目的であり、true か false に関係なく何かを実行することを示すためです。

あなたが思いつく他の解決策は、厄介であるか遅くなり(私はあなたを見ていますThread.currentThread().getStackTrace())、何らかの値をテストする必要がありますが、最初にその値を計算する必要があり、時間がかかります.

本当にパラメーターを渡したくない場合は、オブジェクト内で何らかの状態を使用してこれを決定できますが、最終的にはパラメーターではbooleanなくフィールドになるため、実際には、boolean同じこと。さらに、そのコードを任意の種類の並行システムで実行する場合は、同期を追加する必要があります。これにより、コードをパラメーターとして渡すことで回避できたはずのコードの複雑さがさらに増加し​​ます。

簡単に言えば、パラメーターを使用するだけです。それは分別があり、読みやすく、あなたのコードを読んだ人は誰でもあなたが何をしたかをすぐに理解するでしょう。パラメータを渡す必要がないようにするなど、「何かクールなことをする」という理由だけで、コード内であいまいなこと、読みやすさを妨げることなどをしないでください。次のように考えてみてください。あなたが追加したメソッド以外のメソッドから誰かがそのメソッドを呼び出したい場合、呼び出し方を理解するのにどれくらいの時間がかかりますか?

編集:もう1つのオプションはオーバーロードです。いくつかの一般的なデフォルト値のメソッドと、パラメーターを持つメソッドを提供できます。フィールドを無効にするよりも有効にすることが多い場合:

public void showDialog() {
    showDialog(true);
}

public void showDialog(boolean fieldEnabled) {
    // Show the dialog
}

次に、有効にしてダイアログを開くすべての場所で、最初のメソッド (または を使用して 2 番目のメソッドtrue) を呼び出しますfalse

于 2012-09-26T14:55:06.983 に答える
1

例外を作成してスタック トレースを分析することはできますが、そうすべきではありません。理由は 2 つあります。

  1. 例外は計算コストが高くなります。
  2. メソッドの一般的な Java の概念に違反しています。誰でも呼び出すことができるメソッドを作成する代わりに、少数の場所からのみ機能するメソッドを作成しました。これは長期的に維持するのは悪夢であり、短期的には醜いです。

フラグを渡すのが最良のオプションです。これは、よりクリーンで、より最適化され、より保守しやすいものです。

于 2012-09-26T14:51:33.243 に答える
0

つまり、メソッドのオーバーロードを呼び出します

同じメソッドの異なるパラメーター

可変数パラメータによる検索メソッドのオーバーロード、

于 2012-09-26T14:51:26.470 に答える