【问题标题】:Passing methods as parameters prior to Java 8在 Java 8 之前将方法作为参数传递
【发布时间】:2015-05-01 06:53:15
【问题描述】:

是否可以传递方法和参数?例如,像这些;

public int subMethodA(int value1, int value2, int value3){
    int A = value1;
    int B = value2;
    int C = value3;
    return A|B|C;
}

public int subMethodB(int value1, int value2, int value3){
    int A = value1;
    int B = value2;
    int C = value3;
    return A|B|C;
}

然后我有另一个方法,我想向方法传递一个参数;

public void MainMethod(Method mymethod, int value1, int value2, int value3){
    mymethod(value1, value2, value3);
}

所以稍后,我可以使用类似的名称来调用它;

mainMethod(subMethodA, 1,2,3);
mainMethod(subMethodB, 100,2,1520);

这可能吗?

【问题讨论】:

  • 你能做的最好的就是 Java 8 的功能接口。
  • 我需要使用 java 6/7,这些版本不可以吗?
  • 这是不可能的,现在仍然不可能。你能做的最好的就是用命令模式来模拟它。

标签: java methods parameters main


【解决方案1】:

既然你不能使用 Java 8,这就是你可以做的。

创建一个名为 Method 的接口:

public interface Method {
    public boolean call(int value1,int value2,int value3);
}

创建一个名为 SubMethodA 的 Method 实现:

public class SubMethodA implements Method {

    @Override
    public boolean call(int value1, int value2, int value3) {
        int A = value1;
        int B = value2;
        int C = value3;
        return A|B|C;//This does not compile
    }

}

创建包含 mainMethod 的 Main 类:

public class Main {
    public static void mainMethod(Method method,int value1,int value2,int value3) {
        method.call(value1, value2, value3);
    }
}

您现在可以按如下方式调用 mainMethod:

Main.mainMethod(new SubMethodA(),1,2,3);

如果您需要将一些其他方法传递给 mainMethod,您还可以使用匿名内部类来消除为每个要传递的方法创建一个 .java 文件的需要:

       Main.mainMethod(new Method() {
            public boolean call(int value1, int value2, int value3) {
                int A = value1;
                int B = value2;
                int C = value3;
                return A|B|C;//This does not compile
            }
        },1,2,3);

【讨论】:

  • 干杯,很长,但这就是我所追求的。我希望有更短的方法来做到这一点。
  • 我想这是唯一的方法。您可以节省每次想要传递某种新方法时创建 .java 文件的需要。查看我的编辑。
  • 跳过 SubMethodA 的显式声明并动态创建它是很常见的。例如。 Main.mainMethod(new Method() { @Override public boolean call(int value1, int value2, int value3) { int A = value1; int B = value2; int C = value3; return A|B|C; }}, 1,2,3);
  • @Darren 我认为我的回答已经涵盖了这一点。也许你错过了我的编辑?我已经在 6 分钟前发布了这个;)
  • 啊,对不起:(
【解决方案2】:

我承认我觉得她的要求很奇怪,不知道是什么意图但也许不是最好的前进方式。

不管怎样,有办法是的,使用反射:

MyClass myInstance = new MyClass();
Method myMethod = MyClass.getMethod("myMethod");
Object myReturn = myMethod.invoke(myInstance,param1,param2,param3);

您可以将 java.lang.reflect.Method 作为参数传递,然后调用它。

【讨论】:

    【解决方案3】:

    不,这是不可能的。但如果你愿意,你可以使用简单的设计模式 crate。

    像这样:

    class siplmeCrate...{
         int a,b,c;
         public simpleCrate(int a, b..){
              set up abc...
         }
    
         get abc..
    
    }
    

    然后..

    return new simpleCrate(a,b,c);
    

    【讨论】:

    • 不是我想要的,但我会试一试。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2017-08-21
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多