我有发送到DAO(数据访问对象)的DTO(数据传输对象)。使用枚举或反射的恒定特定方法?需要调用基于字符串的方法
DTO有一个标识符字符串。
基于这个字符串(或者说DTO),我想调用DAO中的特定方法。
这些方法进行数据库调用。
我发现两个选项来做到这一点:使用枚举 2.调用基于反射的方法(在这种情况下,DTO将携带需要被调用的方法的名称 1.恒具体的方法实现。 )
我想知道哪个是更好的选择。还有其他的选择吗?在Enum中进行数据库调用可以吗?
使用的编程语言是Java。
我有发送到DAO(数据访问对象)的DTO(数据传输对象)。使用枚举或反射的恒定特定方法?需要调用基于字符串的方法
DTO有一个标识符字符串。
基于这个字符串(或者说DTO),我想调用DAO中的特定方法。
这些方法进行数据库调用。
我发现两个选项来做到这一点:使用枚举 2.调用基于反射的方法(在这种情况下,DTO将携带需要被调用的方法的名称 1.恒具体的方法实现。 )
我想知道哪个是更好的选择。还有其他的选择吗?在Enum中进行数据库调用可以吗?
使用的编程语言是Java。
我不会把数据库调用放在你的Enum中。相反,请在您的DAO上提供一个接受DTO的方法,然后让该方法根据DTO上的字符串调用DAO中的其他方法。你可以在Enum上使用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<?>
而不是dto.getIdentifier()
使用dto.getClass()
的密钥类型的具体行动。
这对我来说似乎是个好主意。非常感谢您的快速回复。看到每个选项的其他答案,优点和缺点会很有趣。我不是反思的忠实粉丝,除非绝对必要,否则我会尽量避免。 – Vinay 2012-01-15 02:51:41
感谢您的回复。你能否详细说明两件事情:1)“让该方法根据DTO上的字符串调用DAO中的其他方法”如何实现这一目标? 2)我有兴趣知道为什么你认为把数据库调用放在枚举中不是个好主意。 – Vinay 2012-01-15 02:53:19
对于Buc的答案+1的关于如何实现动态调用DAO中的方法的示例。另一方面,尽管技术上没有什么东西可以相信这一点 - 并且存在争议,但至少我的观点是,枚举应该用作标识符 - 而不包含执行操作。 (当然有些情况下,在Enums中有其他方法是适当的,但这些方法通常用于Enum本身每个值的元数据目的。) – ziesemer 2012-01-15 03:06:07
非常感谢您的意见。我几乎相信与Buc的建议一致。 – Vinay 2012-01-15 03:09:36