在Java中:将方法从一个对象传递到另一个对象的最佳方法是什么,以便以后第二个对象可以调用它?
我来自一个ActionScript背景,它很容易传递对方法的引用,因为传递对变量的引用,但这在Java中似乎要困难得多。我发现的最初的几个链接说它不可能(它可能是在发布时),但后来我找到http://www.javacamp.org/javavscsharp/delegate.html详细说明了如何实现这一点。
我使用Javacamp的例子的问题是对该方法的基于字符串的引用。方法一直被重命名,一个字符串引用只会在您实际运行该函数运行时时发出警告,而不是为正确的显式链接编译时间。
没有办法通过与您希望其他类执行的方法的正确显式链接来执行此操作吗?
我希望完成的模型:
编辑: 为了清楚起见,我不是在寻找静态方法解决方案,因为这需要我的Confirmation活动来保存许多逻辑行,以便调用静态方法。确认活动将在我的应用程序中使用:简单"您确定要X吗?" - 是 - 否,如果是,则执行X
我目前正在考虑实现onActivityResult来避免这个问题,但是这种问题比我喜欢的逻辑要多。
答案 0 :(得分:7)
你可以使用这样的界面:
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();
}
}
这可以解决您的问题吗?
答案 1 :(得分:1)
传递方法的典型方法是使用Interface和Anonymous Inner Classes。为了维护静态类型,使用Interface来声明方法签名和键入信息。调用者可以使用该接口的具体实现作为普通类,也可以使用匿名内部类来快速创建类。我将使用标准Java SDK类来说明:
interface Comparator<T> {
public int compare( T a, T b);
}
class SpecialCollection<T> {
public void sort( Comparator<T> comparator ) {...}
}
public class SomeClient {
public void doSomething( SpecialCollection<SpecialObj> collection ) {
collection.sort( new Comparator<SpecialObj>() {
public int compare( SpecialObject a, SpecialObject b ) {
// some implementation
}
} );
}
}
以上是战略模式的一个例子。关于策略模式的事情(以及传递Javascript中的回调方法)。作者必须计划这些类型的扩展。作者必须预先预测他/她希望您扩展的位置。如果您使用Interfaces,它就会发生最干净的事情。
但是,纯委托不必总是涉及接口。您可以传递具体的类,因为Java总是可以传递一个子类来覆盖该类的各种方法,以更改将调用的方法或代码。例如,在Java中,InputStream / OutputStream是抽象类,您通常将子类实例传递给方法。
答案 2 :(得分:0)
如果您需要根据上下文采用不同的方法(AKA,它根据创建的方式而有所不同),您将要传递该方法所在类的实例。< / p>
如果它是静态方法,如果您在新类的顶部导入该类,则可以仅引用该方法本身。
例如,假设您有一个方法可以告诉您有关某个字符串的信息。如果班级看起来像这样:
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);
}
}
然后你想要传递实例,因为它是非静态的。不同的实例具有创建它们的不同字符串,因此如果使用其他实例,将获得不同的返回值。
但是,如果你的班级看起来更像这样:
class stringChecker {
public static int getStringLength(String s) {
return s.length();
}
public static boolean stringStartsWith(String s, String startsWith) {
return (s.indexOf(startsWith) == 0);
}
}
然后您可以使用stringChecker.getStringLength(&#34; test&#34;);来引用这些方法,因为这些方法是静态的。它们所处的实例并不重要。返回的结果仅取决于传入的内容。您只需确保添加import stringChecker;在顶部或任何你的课程将被称为。对于你来说,它可能就像com.example.blah.otherthing.stringChecker,因为你正在使用android。
祝你好运!我希望这会有所帮助:) 编辑:看起来我可能已经过快地阅读了这个问题...如果这不是您所询问的问题,请通过评论告诉我,我会删除此答案以便不要混淆任何人。答案 3 :(得分:0)
您说您正在项目中使用它来打开确认活动。
活动不应包含彼此的引用以避免内存泄漏。要在活动之间传递数据,应使用 Intent 类。要接收结果,请调用 StartActivityForResult()并在 onActivityResult()方法中获取结果。
但总的来说,你的任务更适合 AlertDialog 或 PopupWindow 。