2011-05-01 28 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

相關問題