使用Enums OR Refection的常量特定方法?需要根据字符串调用方法

时间:2012-01-15 02:36:45

标签: java reflection enums

我有DTO(数据传输对象)发送到DAO(数据访问对象)。

DTO有一个标识符字符串。

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

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

我找到了两个选项来做到这一点: 1.使用Enum的常量特定方法实现 2.基于反射调用方法(在这种情况下,DTO将携带需要调用的方法的名称。)

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

使用的编程语言是Java。

2 个答案:

答案 0 :(得分:1)

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

我也会避免反思,这主要是由于其他复杂性 - 包括调试和故障排除,以及潜在的安全问题。 (如果String包含您不想调用的方法名称,该怎么办?)

答案 1 :(得分: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();
    }

}

如果您愿意,您甚至可以根据不同的DTO类型调整此想法以执行特定操作 将地图的密钥类型更改为Class<?>,而不是dto.getIdentifier()使用dto.getClass()

相关问题