2012-01-15 48 views
2

我有发送到DAO(数据访问对象)的DTO(数据传输对象)。使用枚举或反射的恒定特定方法?需要调用基于字符串的方法

DTO有一个标识符字符串。

基于这个字符串(或者说DTO),我想调用DAO中的特定方法。

这些方法进行数据库调用。

我发现两个选项来做到这一点:使用枚举 2.调用基于反射的方法(在这种情况下,DTO将携带需要被调用的方法的名称 1.恒具体的方法实现。 )

我想知道哪个是更好的选择。还有其他的选择吗?在Enum中进行数据库调用可以吗?

使用的编程语言是Java。

回答

1

我不会把数据库调用放在你的Enum中。相反,请在您的DAO上提供一个接受DTO的方法,然后让该方法根据DTO上的字符串调用DAO中的其他方法。你可以在Enum上使用switch语句,并使其非常高效。 (或者,把这个实现放在一个单独的“适配器”类中,因为可以认为这个代码并不严格属于DAO)

我也会避免反射,主要是由于额外的复杂性 - 包括调试和故障排除,以及潜在的安全问题。 (如果字符串包含什么,你不想叫方法名?)

+0

感谢您的回复。你能否详细说明两件事情:1)“让该方法根据DTO上的字符串调用DAO中的其他方法”如何实现这一目标? 2)我有兴趣知道为什么你认为把数据库调用放在枚举中不是个好主意。 – Vinay 2012-01-15 02:53:19

+0

对于Buc的答案+1的关于如何实现动态调用DAO中的方法的示例。另一方面,尽管技术上没有什么东西可以相信这一点 - 并且存在争议,但至少我的观点是,枚举应该用作标识符 - 而不包含执行操作。 (当然有些情况下,在Enums中有其他方法是适当的,但这些方法通常用于Enum本身每个值的元数据目的。) – ziesemer 2012-01-15 03:06:07

+0

非常感谢您的意见。我几乎相信与Buc的建议一致。 – Vinay 2012-01-15 03:09:36

1

您可以创建一个映射的字符串映射到方法调用:

class YourDAO { 

    private interface Action { 
     public void perform(); 
    } 

    private Map<String, Action> actions; 

    public YourDAO() { 
     actions.add("String1", new Action() { 
      public void perform() { 
       daoMethod1(); 
      } 
     } 
     actions.add("String2", new Action() { 
      public void perform() { 
       daoMethod2(); 
      } 
     } 
    } 

    public void daoMethod1() { 
     ... 
    } 

    public void daoMethod2() { 
     ... 
    } 

    public void doSomethingWithDTO(YourDTO dto) { 
     actions.get(dto.getIdentifier()).perform(); 
    } 

} 

你甚至可以适应这样的想法来执行如果您将 更改为Class<?>而不是dto.getIdentifier()使用dto.getClass()的密钥类型的具体行动。

+0

这对我来说似乎是个好主意。非常感谢您的快速回复。看到每个选项的其他答案,优点和缺点会很有趣。我不是反思的忠实粉丝,除非绝对必要,否则我会尽量避免。 – Vinay 2012-01-15 02:51:41