2014-11-08 67 views
0

我想使用RabbitMQ並基於不同的消息,應該調用不同的實現。RabbitMQ - 根據不同的條件調用不同的實現

我將消息格式設置爲JSON,並且有一個「callType」字段,它的值是類名實現的通用接口。例如,所有的實現都實現了接口「任務」,並且我實現了「TaskImp1」,「TaskImp2」,「TaskImp3」。

因此,代碼應該像

if (callType=="TaskImp1") 
((Task)TaskImp1).runTask() 
if (callType=="TaskImp2") 
((Task)TaskImp2).runTask() 
if (callType=="TaskImp3") 
((Task)TaskImp3).runTask() 

但可以把它變得更加靈活?如果稍後我開發一個新的「TaskImp4」,我不想更改調用代碼,是否有可能讓java自動選擇正確的實現,因爲callType實際上是實現的類名。

回答

0

肯定的是:把你的任務實例中的地圖:

private Map<String, Task> tasksByName = new HashMap<>(); 

... 

tasksByName.put("TaskImp1", new TaskImp1()); 
tasksByName.put("TaskImp2", new TaskImp2()); 
tasksByName.put("TaskImp3", new TaskImp3()); 

... 

String callType = message.getCallType(); 
Task task = tasksByName.get(callType); 
task.runTask(); 

此外,閱讀How do I compare strings in Java?

0

您有機會在此處使用策略。因此對於例如你可以這樣做:

public class MyTask { 
    private Task task; 
    public MyTask(Task task) { 
     this.task = task; 
    } 

    public void doSomething() { 
     task.runTask(); 
    } 

    public static void main(String args[]) { 
     MyTask task = new MyTask(new TaskImpl1());//or even you could use setTask() api to inject task at runtime rather than doing cast on compile time. 
     task.doSomething(); 
     task = new MyTask(new TaskImpl2()); 
     task.doSomething(); 
     task = new MyTask(new TaskImpl3()); 
     task.doSomething(); 
    } 
} 

這樣你就可以使你的代碼具有可擴展性。明天如果你有taskImpl4,你可以單獨編寫代碼並注入MyTask,甚至不用觸及MyTask類的實現。

0

由於@ovdsrn已經說過,你可以使用反射。簡單的例子是像(關鍵是getTask靜態方法。另外,還要注意的是,當您使用Class.forName您必須指定完整的「路徑」(包)爲您的類)

// ITask.java

package main; 

public interface ITask { 
    void doSomething(); 
} 

// Task1.java

package main; 

    public class Task1 implements ITask { 
     @Override 
     public void doSomething() { 
      System.out.println("Task1"); 
     }  
    } 

// Task2.java

package main; 

    public class Task2 implements ITask { 
     @Override 
     public void doSomething() { 
      System.out.println("Task2"); 
     }  
    } 

//主要

package main; 

public class JavaTest { 
    private static ITask getTask(String name) { 
     try { 
      Class<?> cls = Class.forName(name); 
      Object clsInstance = (Object) cls.newInstance(); 
      return (ITask)clsInstance; 
     } catch (Exception e) { // you can handle here only specific exceptions 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     String name = args.length > 0 ? args[0] : "Task2"; 
     ITask task = getTask("main." + name); 
     if (task != null) { 
      task.doSomething(); 
     } 
     else { 
      System.out.println("can not make instance of class: " + name); 
     } 
    } 
}