2013-12-10 43 views
1

我必須接受這樣一個事件的方法:將文本轉換文件值轉換爲其他類型的Java

addEvent(Event event); 

事件構造函數接受一個長型是這樣的:

Event(long delayTime); 

所以,我可以明確地將一個參數定義爲addEvent,像這樣:

addEvent(new ThermostatNight(2000)); //ThermostatNight=Event and 2000=delayTime 

但是,我想提取EventdelayTime值,將它們保存在一個數組中,然後在我循環訪問數組時將它們傳遞給addEvent()構造。

我已經能夠解決一半的問題。我以前Long.parseLong從文本文件中的字符串delayTime值轉換成long類型,並把它傳遞到事件構造是這樣的:

addEvent(ThermostatNight(y)); // Where y = the converted long type delayTime 

現在我只需要弄清楚如何將字符串事件類型從轉換文本文件,例如ThermostatNight,爲事件的類型,這樣的方法的addEvent會接受這樣的:

addEvent(x(y)) // x = Event value; y = long value 

Class.forName這項工作?我曾嘗試將它用於陣列中的事件,但我得到了一個ClassNotFoundException。下面是一個代碼片段展示什麼,我試圖做的:

for(String e2 : array2){ 
    try{ 
     Class<?> className = Class.forName(e2); 
     System.out.println(className);   
    } catch (ClassNotFoundException e) { 
     System.out.println("Class not found"); 
    } 
} 

回答

1

沒有反射的另一種解決方案(由於避免反射的很多原因)是使用工廠模式來解決這個問題。

工廠類可能是這樣的(假設EventThermostatNight和一個接口或抽象類AnotherEventClass):這樣調用

public class EventFactory { 
    public static Event createSpecificEvent(String eventName, long delayTime) { 
     Event event; 

     switch (eventName) { // String switch-case statements since Java 7 
     case "ThermostatNight": 
      event = new ThermostatNight(delayTime); 
      break; 
     case "AnotherEventClass": 
      event = new AnotherEventClass(delayTime); 
      break; 
     default: 
      throw new IllegalArgumentException("Unknown event type."); 
     } 

     return event; 
    } 
} 

和:

long y = 1234; 

for (String e2 : array2) { 
    Event event = EventFactory.createSpecificEvent(e2, y); 
    System.out.println(event.getClass().getName()); 
} 
+0

每個案件之間應該有中斷嗎? – LooMeenin

+0

好點!謝謝,我已經糾正它! – bobbel

1

是的,應該的Class.forName這裏工作。

1)這裏e2應該像「package1.package2.ThermostatNight」,即完整的
合格的類名稱。此外,該類應該可用於此代碼,在
運行時加載(所以類必須以編譯形式存在,您知道,
在jar文件中或類路徑中的class dir中)。

2)加載完類後,需要通過反射查找並調用合適的構造函數(長參數的構造函數)。
http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/package-summary.html
http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html
http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html

3)什麼是的addEvent的參數聲明的類型?
如果是ThermostatNight(而不是對象),那麼你就需要
投你創建的對象(從動態加載的類)
ThermostatNight這意味着你需要在編譯時使用ThermostatNight
和所以那麼你不應該有1)的問題,因爲
該類的存在或不存在,在編譯時變得可見


+0

當你說E2應該像「package1.package2.ThermostatNight」你的意思是我必須明確地輸入?有很多文本文件,事件類型會改變,所以我希望Class.forName爲我抓取事件類型...我希望這是有道理的。我是Java和編程新手。 – LooMeenin

+0

好的,如果你有事件並且它們可以是不同的類型,那麼你的程序需要知道它們。不,您不需要在代碼中對完整的類名進行硬編碼,但代碼需要從某個地方加載這些完整的類名,例如從屬性文件。 –