使用Java调用委托方法

Cur*_*nce 4 java android

在Java中:将方法从一个对象传递到另一个对象的最佳方法是什么,以便以后第二个对象可以调用它?

我来自一个ActionScript背景,它很容易传递对方法的引用,因为它传递对变量的引用,但这在Java中似乎要困难得多.我发现的前几个链接说不可能(并且它可能在发布时),但后来我找到了http://www.javacamp.org/javavscsharp/delegate.html详细说明了这一点可以完成.

我使用Javacamp的例子的问题是基于字符串的方法引用.方法一直被重命名,一个字符串引用只会在您实际运行该函数运行时而不是为正确的显式链接编译时间时进行投诉.

有没有办法用你希望其他类执行的方法的正确显式链接来做到这一点?

我希望完成的模型:

  1. Player单击Activity1上的升级按钮> Activity1将升级方法传递给新的确认活动
  2. 播放器单击"是">确认活动调用从Activity1传入的升级方法
  3. 或:玩家单击"否">确认活动关闭

编辑:要清楚我不是在寻找静态方法解决方案,因为这需要我的确认活动来保存许多逻辑行,以便调用静态方法.确认活动将在我的应用程序中使用:简单的"您确定要X吗?" - 是 - 否,如果是,则执行X.

我目前正在考虑实现onActivityResult来避免这个问题,但这比我喜欢的这类问题更具逻辑性.

jcs*_*tar 8

你可以使用这样的接口:

public interface MyMethod {
    public void method();
}


public class FirtObject{

    private SecondObject ob;

    public void tellSecondObjectExecuteLater(){
        ob.executeLater( new MyMethod() { 
          public void method(){System.out.println("duh Method");} });
    }
}

public class SecondObject {

    private MyMethod myMth;

    public void executeLater(MyMethod mth){
        myMth = mth;
    }

    public void executeNow(){
        myMth.method();
    }
}
Run Code Online (Sandbox Code Playgroud)

这会解决你的问题吗?


Ale*_*x K 0

如果您需要该方法根据上下文采取不同的行为(又名,根据其创建方式而有所不同),您将需要传递该方法所在类的实例。

如果它是静态方法,如果您在新类的顶部导入该类,则只需引用该方法本身即可。

例如,假设您有一个方法可以告诉您有关某个字符串的信息。如果类看起来像这样:

class stringChecker {
    private String stringToCheck;
    public class stringChecker(String s) {
         stringToCheck = s;
    }
    public int getStringLength() {
         return stringToCheck.length();
    }
    public boolean stringStartsWith(String startsWith) {
         return (stringToCheck.indexOf(startsWith) == 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您需要传递该实例,因为它是非静态的。不同的实例具有不同的创建时所用的字符串,因此如果您使用不同的实例,您将获得不同的返回值。

但是,如果您的类看起来更像这样:

class stringChecker {
     public static int getStringLength(String s) {
          return s.length();
     }
     public static boolean stringStartsWith(String s, String startsWith) {
          return (s.indexOf(startsWith) == 0);
     }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用 stringChecker.getStringLength("test"); 引用这些方法,因为这些方法是静态的。它们位于什么实例中并不重要。返回的结果仅取决于传入的内容。您只需确保添加 import stringChecker; 在顶部或者无论你的班级被称为什么。对于您来说,它可能类似于 com.example.blah.otherthing.stringChecker,因为您正在使用 android。

祝你好运!我希望这有帮助 :)

编辑:看来我可能读得太快了......如果这不是您要问的问题,请通过评论告诉我,我将删除这个答案,以免让其他人感到困惑。