1

可能かどうかはわかりませんが、メソッドまたは関数を配列に格納できますか? 私は今、多次元配列を知っており、それを使用して、必要に応じて多くの配列を格納しています。今やりたいことは、作成したメソッドまたは関数を特定のクラスに保存することです。すべての関数を特定のクラスに保存したいので、ループを使用したい場合はそれを呼び出します。そして、コーディングをよりクリーンで理解しやすいものにするためです。例:

public String[] getDesiredFunction = {getName(),getLastname(),getMiddle()};
for(int i = 0;i<3;i++){
    if(i == 1){
        getDesiredFunction[i];
    }
}

そのように?可能ですか?

4

5 に答える 5

4

やりたいことを正確に行うことはできませんが、を使用して同様のことを行うことができますinterface:

interface Function {
    public void run();
}

class GetNameFunction implements Function {
    public void run() {
        //do stuff
    }
}
...

そして、次のように書くことができます:

Function[] functions = {new GetNameFunction()};
    for(int i = 0; i < functions.length; i++){
        functions[i].run();
    }
}
于 2012-07-13T07:38:59.097 に答える
1

Java 6 には一次関数はありませんが、関数オブジェクト パターンを使用できます。

interface NullaryFunction< B > {
    B f();
}

public class Example {
    private final Map< String, NullaryFunction< String > > mFuncs = new HashMap< String, NullaryFunction< String > >() { {
        put( "getName", fncGetName );
        put( "getLastname", fncGetLastname );
        put( "getMiddle", fncGetMiddle );
    } };
    public String getName() { /* ... */ }
    private NullaryFunction< String > fncGetName = new NullaryFunction< String >() {
        @Override String f() { return getName(); }
    };
    public String getMiddle() { /* ... */ }
    private NullaryFunction< String > fncGetMiddle = new NullaryFunction< String >() {
        @Override String f() { return getMiddle(); }
    };
    public String getLastname() { /* ... */ }
    private NullaryFunction< String > fncGetLastname = new NullaryFunction< String >() {
        @Override String f() { return getLastname(); }
    };

    public String runAFunction( String strName ) {
        return mFuncs.get(strName).f();
    }
}
于 2012-07-13T07:37:28.303 に答える
0

オブジェクト インスタンスとメソッド名を文字列として保存できます。リフレクションを使用すると、次のようにこのメソッドを呼び出すことができます。

public class Test {


public void sayHello(){
    System.out.println("hello");
}
/**
 * @param args
 */
public static void main(String[] args) {
    Test test = new Test();
    String methodName = "sayHello";
    try {
        Method m = test.getClass().getMethod(methodName, null);
        m.invoke(test, null);
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

}

Java refectionを参照する必要があります

于 2012-07-13T07:23:26.283 に答える
0

Java はユース ケースに適していません。反射でできます。

出発点として、リフレクション トレイルを調べるか、関連するstackoverflow questionを参照してください。

于 2012-07-13T07:15:17.387 に答える
-2

質問で述べた方法は機能しません。別の方法として、次のように行うことができます。

public String[] getDesiredFunction = {getName(),getLastname(),getMiddle()};
for(int i = 0;i<3;i++){
if(getDesiredFunction[i].equals("getName()")){
     getName();
  }
}
于 2012-07-13T07:17:29.473 に答える