我的代码设计陷入了两难境地。
首先,我正在将VB转换为Java系统。 VB程序有一个类模块,它类似于POJO的组合,并为其逻辑访问数据库。我在JAVA中用getter和setter创建了一个类似的类。我的困境是因为我需要复制VB代码的结构(我们被迫),我还需要在我的JAVA类中包含查询服务。但在我们的框架中,只有服务类可以访问查询服务。
我正在考虑将我的JAVA类更改为一个abstact类,而是使用Anonymous类。
样品:
public abstract class MyClass {
private int a;
private int b;
public String calculate1() {
// do processing for variables a and b
String sql = "" // build sql here
List<Map<String, Object>> result = query(sql);
}
public String calculate2() {
// do processing for variables a and b
String anotherSql = "" // build anotherSql
List<Map<String, Object>> result = query(anotherSql);
}
protected abstract List<Map<String, Object>> query(String sql);
// getters and setters for a and b
}
public class MyService {
@Autowired
private QueryService myQueryService;
public void execute() {
MyClass myClass = new MyClass() {
@Override
protected List<Map<String, Object>> query(String sql) {
return myQueryService.executeQuery(sql);
}
};
}
}
需要考虑的一些事项:
同样由于这种困境,我被迫使用字符串查询和JDBC模板。最初,我们的框架使用DAO对象和Hibernate。如果有人也可以使用DAO解决代码,那会更好。如果我将使用DAO对象,我将不得不使用不同的DAO对象及其DAO服务类。
我不完全确定这是不是一个好的设计。我不知道这是否有效。我无法在我的环境中运行它。
如果有人可以启发我,我会非常感激。
谢谢!
答案 0 :(得分:1)
由于MyClass
的实例在没有QueryService
实例的情况下无法运行,您如何将查询服务的引用传递给MyClass
的构造函数:
public abstract class MyClass {
private final QueryService queryService;
public MyClass (QueryService queryService) {
this.queryService = queryService;
}
protected List<Map<String, Object>> query(String sql) {
return queryService.executeQuery(sql);
}
}
public class MyService {
@Autowired
private QueryService myQueryService;
public void execute() {
MyClass myClass = new MyClass(myQueryService);
}
}
使queryService
实例字段final
具有这样的构造函数,在代码中清楚地表达了这种依赖关系。