首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java代码设计困境

Java代码设计困境
EN

Stack Overflow用户
提问于 2012-10-27 17:39:43
回答 1查看 208关注 0票数 3

对于代码的设计,我有一个进退两难的境地。

首先,我正在将VB转换成Java系统。VB程序有一个类模块,它类似于POJO的组合,并访问数据库以实现其逻辑。我用getters和setter在JAVA中创建了一个类似的类。我的困境是,由于我需要复制VB代码的结构(我们是被迫的),我还需要在JAVA类中包含查询服务。但是在我们的框架中,只有服务类可以访问查询服务。

我正在考虑将我的JAVA类更改为一个缩写类,而不是使用匿名类。

示例:

代码语言:javascript
复制
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);
             }
          };
     }
}

有几件事要考虑:

  1. 我的服务是单例范围bean。
  2. 我还喜欢基于会话的MyClass (每个用户一个实例)。
  3. 因为我不会在Spring上下文中声明MyClass,所以它不能使用依赖注入,也不能使用其他服务。我将在会话中保存实例,并将只检索MyClass实例。

同样,由于这种两难处境,我不得不使用字符串查询和JDBC模板。最初,我们的框架使用DAO对象和Hibernate。如果有人也能用DAO来解决代码,那就更好了。如果要使用DAO对象,则必须使用不同的DAO对象及其DAO服务类。

我不完全确定这是否一个好的设计。我也不知道这是否管用。我无法在我的环境中运行这个程序。

如果有人能启发我,我会非常感激的。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-27 18:13:14

由于MyClass的一个实例没有QueryService的实例就无法工作,那么直接将对查询服务的引用传递给MyClass的构造函数如何?

代码语言:javascript
复制
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,并具有这样的构造函数,可以在代码中清楚地表达这种依赖关系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13102525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档