2014-07-24 52 views
0

我正在開發一個用java編寫的項目,對於語言和麪向對象來說是相當新的。我的困境是我想根據變量的值從特定的類中執行任務/功能。JAVA:基於變量值的調用類方法

這是我試圖實現的一種。

class mainClass{ 

    String option; 

    public static void main(String[] args) { 
     mainClass main = new mainClass(); 
    } 

    mainClass(){ 
     secondClass sC = new secondClass(); 
     thirdClass tC = new thirdClass(); 
     switch (option){ 
      case "1" : 
       sC.doSomething(); 
      case "2" : 
       tC.doSomething(); 
     } 
    } 

} 

class secondClass{ 
    void doSomething(){ 
     System.out.println("1"); 
    } 


} 

class thirdClass{ 
    void doSomething(){ 
     System.out.println("2"); 
    } 

} 

的原因,我不希望這樣做,是因爲如果我想添加一個第四,第五,第六類等等......我將不得不更新交換機。

我嘗試使用散列圖。我在哪裏給secondClass分配了「1」的密鑰。但是後來我不得不拋出這個對象,但是這使我不知道什麼類需要事先被調用,這讓我很頭痛。

於是我試圖用這樣一個HashMap, HashMap<String, Object> map = new HashMap<String, Object>();

,我可以那麼就map.get(「1」),但是現在我不能調用任何的方法有問題的類。

如果我需要使用大型開關語句,我會,但我正在積極尋求更有效的選擇。

+4

接口,繼承和方法覆蓋 - 學習它們。 – james

+0

如果他們都有一個'doSomething()'方法,爲什麼不讓它們都擴展一個公共基類,或者實現一個通用接口?另外,你需要'switch'中的'break'語句。 –

+0

是的,我知道這只是我正在尋找的那種事物的快速模擬。沒有擴展doSomething()的原因是doSomething()在每個實例中都不相同。謝謝@詹姆斯我會着眼於壓倒一切!我想過繼承,但正如前面所述,每個doSomething()方法都不同。 –

回答

1

你是正確的使用Map,但你也是對鑄造不屑。但是,現在用泛型可以解決所有這些問題:

interface DoesSomething { 
    // An object implementing this interface does something. 
    public void doSomething(); 
} 

// Class that does something. 
class FirstClass implements DoesSomething { 

    @Override 
    public void doSomething() { 
     // What FirstClass does. 
    } 

} 

// Another class that does something. 
class SecondClass implements DoesSomething { 

    @Override 
    public void doSomething() { 
     // What SecondClass does. 
    } 

} 


// How I know what to do. Map the string to a DoesSomethng. 
Map<String, DoesSomething> whatToDo = new HashMap<>(); 
{ 
    // Populate my map. 
    whatToDo.put("1", new FirstClass()); 
    whatToDo.put("2", new SecondClass()); 
} 

public void doSomethingDependingOnSomething(String something) { 
    // Look up the string in the map. 
    DoesSomething toDo = whatToDo.get(something); 
    // Was it in there? 
    if (toDo != null) { 
     // Yes! Make it do it's thing. 
     toDo.doSomething(); 
    } 
} 
+0

大聲笑我檢查'containsKey'是一個更好的方法來檢查它(因爲語義暗示),事實證明'HashMap'實現'containsKey'爲'return get(key)!= null;'。 – AlexR

+0

謝謝你。這正是我所期待的。當我們說話時,我正在閱讀界面和覆蓋!再次感謝 –

1

如果你想避免使用反射(至極這裏推薦),你應該考慮一個簡單的SAM-接口:

public interface Doable { public void doSomething(); } 

,並擁有所有類實現的接口(在這些類不再需要其他的變化)並具有Map<String, Doable>,並呼籲

if (map.containsKey(option)) map.get(option).doSomething(); 

// Or (may be a little faster) 
Doable opt = map.get(option); 
if (opt != null) opt.doSomething(); 

如果您的實現有不同的方法,你很可能會被綁定到使用Reflection得到聲明的方法,並以字符串比較。

+0

謝謝。我會試試這個!欣賞它。 –

+0

我仍然希望看到一個更好的例子,更接近你真正在做的事情。有很多方法可以做到這一點,甚至有更多的方法做錯了。我想在你的設計上得到一些建議以及編碼可以幫助你更多。 – markspace