Java 使用枚举或反射的常量特定方法?需要调用基于字符串的方法

Java 使用枚举或反射的常量特定方法?需要调用基于字符串的方法,java,reflection,enums,Java,Reflection,Enums,我将DTO(数据传输对象)发送到DAO(数据访问对象) DTO有一个标识符字符串 基于这个字符串(或者更确切地说是DTO),我想调用DAO中的特定方法 这些方法进行数据库调用 我发现有两种方法可以做到这一点: 1.使用枚举实现特定于常量的方法 2.基于反射调用方法(在这种情况下,DTO将携带需要调用的方法的名称。) 我想知道哪个是更好的选择。还有其他选择吗?可以在枚举中调用数据库吗 使用的编程语言是Java 我不会将数据库调用放入您的枚举中。相反,在DAO上提供一个接受DTO的方法,然后让该方法

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

DTO有一个标识符字符串

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

这些方法进行数据库调用

我发现有两种方法可以做到这一点: 1.使用枚举实现特定于常量的方法 2.基于反射调用方法(在这种情况下,DTO将携带需要调用的方法的名称。)

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


使用的编程语言是Java

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


我也会避免反射,主要是由于额外的复杂性——包括调试和故障排除,以及潜在的安全问题。(如果字符串包含不希望调用的方法名,该怎么办?

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

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 YourDAO{
专用接口动作{
公开无效执行();
}
私人地图行动;
公共游道(){
actions.add(“String1”,新操作(){
公开执行{
方法1();
}
}
添加(“String2”,新操作(){
公开执行{
dao方法2();
}
}
}
公共方法1(){
...
}
公共方法2(){
...
}
公共无效数据源(您的数据源){
actions.get(dto.getIdentifier()).perform();
}
}
如果您愿意,您甚至可以调整这个想法,在不同的DTO类型上执行特定的操作
将映射的键类型更改为
Class
,并使用
dto.getIdentifier()代替
dto.getIdentifier()

这对我来说似乎是个好主意。非常感谢您的快速回复。我很想看看其他答案,每个选项的优缺点。我不太喜欢思考,除非绝对必要,否则我会尽量避免思考。谢谢您的回复。您能详细说明两件事吗:1)“让该方法根据DTO上的字符串调用DAO中的其他方法”您将如何实现这一点?2)我很想知道为什么您认为将数据库调用放在枚举中不是一个好主意。+1是Buc关于如何实现在DAO中动态调用方法的一个示例的答案。另一方面,虽然从技术上讲没有什么可以相信的,而且是有争议的,但至少我的观点是枚举应该用作标识符-并且不包含正在执行的操作。(当然,在某些情况下,在枚举中使用其他方法是合适的,但这些方法通常用于枚举本身上每个值的元数据目的。)非常感谢您的输入。我几乎相信我会同意Buc的建议。@Vinay-我会使用混合方法。使用枚举作为标识符,然后使用
EnumMap
存储您的操作。这将更有效,并保证没有匹配的枚举操作无法存在,这有助于防止YPO等。如果您能够修改DTO以包含
enum
s而不是字符串作为标识符,那么ziesemer的
EnumMap
解决方案将真正更有效。