2011-05-01 45 views
2

我想知道如何在方法有参数本身的情况下为Method参数调用者创建一个契约。所以,我用...作为带签名合同的参数的方法?

ClassA { 
    String string_ = "HI"; 

    public static void subscribe(Object class, Method action) { 
    action.invoke(class, string_); 
    } 
} 

ClassB { 

    ClassB() { 
    ClassA.subscribe(this, this.getClass().getMethod("load", String.class)); 
    } 

    public void load(String input) { 
    if(input.equals("HI")) { 
     ... 
    } 
    } 
} 

我想知道如何确保为“行动”,通过该方法将字符串作为参数(即确保法动作==负载(串){})?有没有这样的事情可供选择:

public static void subscribe(Object class, Method action(String.class)) { 

我想这样做的认购如此的方法签名,这是有目共睹的调用类(ClassB的),它需要准备采取指定类型的参数。

编辑:更新最后的代码位,所以不显示,如果方法是通用的。对我而言,选择使用<>来代表我试图传达的一个例子。

回答

2

在Java中没有办法做到这一点。 Method类不是通用的,并且没有办法这样做,因为方法可以接受任意数量的参数,并且没有办法在可变数量的类型上使类具有泛型。

也许你能做的最好的是声明自己的类型,而不是使用方法:

public interface Action<T, P> { 
    public void invoke(T target, P parameter); 
} 

然后:

public static <T> void subscribe(T obj, Action<T, String> action) { 
    action.invoke(obj, string_); 
} 

ClassB() { 
    ClassA.subscribe(this, new Action<ClassB, String>() { 
     public void invoke(ClassB target, String parameter) { 
      target.load(parameter); 
     } 
    }); 
} 
+0

+1。哦!接口中的方法是隐式公开的。 – 2011-05-01 19:47:45

+0

@Laurent:没错,但我是一个智者曾写过“显式比隐式更好”,我的感觉是,在接口中声明方法是真实的时代之一。 – 2011-05-01 19:54:21

+0

我接受这个答案,因为它正确地回答说,没有办法在Java中做到这一点,为什么,并给出了一个可能的解决方案。每个人似乎都以这样或那样的方式使用命令模式,所以我把它们都作为一个部分解决方案。 – 2011-05-01 20:55:13

1

在C#中有办法实现你正在尝试做的事情,但我想不出一种方法来确保在编译时为java。

你可以诉诸使用intefaces吗?

interface ILoader{ 
    void load(String input); 
} 

ClassA { 
    String string_ = "HI"; 

    public static void subscribe(ILoader loader) { 
    loader.load(string_); 
    } 
} 

ClassB implements ILoader { 

    ClassB() { 
    ClassA.subscribe(this); 
    } 

    public void load(String input) { 
    if(input.equals("HI")) { 
     ... 
    } 
    } 
} 
1

你不能使用Command Pattern的轻微的修改?

puclic interface LoadCommand { 
    public load(String input); 
} 

public class ClassB implements LoadCommand { 
    public load(String input) { 
    // do stuff here 
    } 
} 

public class ClassA { 

    String myInput = "HI"; 

    public static void subscribe(LoadCommand command) { 
    command.load(myInput) 
    } 
} 

LoadCommand接口的load方法使用一个String参数。

+0

这是不完全的命令,据我所知,因为在命令接口上的方法是采取一个参数。命令的一部分是它是独立的;任何类似参数的东西都已经打包到Command对象中了。 – 2011-05-01 22:10:36

+0

@汤姆安德森:你说得对。我改变了我的回答,说“对命令模式稍作修改” – MarcoS 2011-05-02 05:54:16

相关问题