0

別のメソッドがパラメーターとして渡されるメソッドを持つことが可能かどうか疑問に思っているので、最初のメソッドはパラメーターで渡されたメソッドを呼び出すことができますか?

たとえば、次のようにします。

public void goToVisitManagementForm() throws ParseException {
    if (isAuthenticated() && userTypeIs("Patient")) {

         // I could have this whole block just moved to another method?
        Panel newPanel = new Panel("Choose the details for your visit");
        Component visitManagementForm = new VisitManagementForm(userData,
                this);
        newPanel.addComponent(visitManagementForm);
        mainWindow.setMainPanel(newPanel);

    } else {
        authenticate();
    }
}

コード ブロックが別のメソッドに移動され、このメソッドにパラメーターとして渡される場合。どうすればそれを達成できますか?これは良い習慣ですか? この場合、私は常に貼り付ける必要がある if を持っているからです... これの他の側面はどうですか?

4

3 に答える 3

4

これは高階関数と呼ばれ、Java 7 以下では実行できません。関数が期待するインターフェイスをインスタンス化する匿名クラスを使用して、関数を他の関数に渡し、そのオブジェクトで関数を呼び出すことをシミュレートできます。

たとえば、引数なしの関数を渡すには:

interface Function {
    void apply();
}

void takesAFunction(Function function) {
    function.apply();
}

次に、次のコード スニペットは、必要なことを行います。

Function myFunction = new Function() {
    @Override
    public void apply() {
        // your code here.
    }
};
takesAFunction(myFunction);

ちなみに、リフレクションは、この種の問題では極端にやり過ぎです。

于 2013-01-12T05:23:06.773 に答える
1

Java Reflection APIを使用して、メソッドをパラメーターとして渡すことができます。

まず、クラスからメソッド オブジェクトを取得します。

 Class c = MyClass.class;
 Method[] methods = c.getMethods();
 Method m = // choose the method you want

次に、関数は Method オブジェクトをパラメーターとして受け取ることができます。

 public void aFunction(MyClass o, Method m);

そして、その関数内でメソッドを呼び出すことができます:

 m.invoke(o);

これは、メソッドがパラメーターを取らない非常に単純な例です。この例を拡張してパラメーターを追加するのは非常に簡単です。

于 2013-01-12T05:26:42.447 に答える
0

はい。ただし、非常に高度な手順です。オブジェクトを使用する必要がありMethodます。メソッドのjavadocは次のとおりです。

ここにjavadocがあります:
- http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html

私があなたの質問を正しく理解していれば、メソッドをパラメーターとして渡すことができます。Javaでこれを行うための「スムーズな」方法は実際にはありません。Objective C では、言語に組み込まれています (@selector タグ)。

于 2013-01-12T05:25:52.143 に答える