2014-11-08 27 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); 
     } 
    } 
} 
相关问题