我有DTO(数据传输对象)发送到DAO(数据访问对象)。
DTO有一个标识符字符串。
基于这个字符串(或者更确切地说是DTO),我想在DAO中调用特定的方法。
这些方法进行数据库调用。
我找到了两个选项来做到这一点: 1.使用Enum的常量特定方法实现 2.基于反射调用方法(在这种情况下,DTO将携带需要调用的方法的名称。)
我想知道哪个是更好的选择。还有其他选择吗?可以在Enum中进行数据库调用吗。
使用的编程语言是Java。
答案 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()
。