Java代码设计困境

3

我在代码设计方面遇到了一个困境。

首先,我正在将VB转换为Java系统。VB程序有一个类模块,类似于POJO,并访问数据库以进行逻辑处理。我创建了一个类似的Java类,包括getter和setter。我的困境是,由于我需要复制VB代码的结构(我们被迫这样做),我还需要在我的Java类中包含查询服务。但在我们的框架中,只有服务类才能访问查询服务。

我考虑将我的Java类更改为抽象类,并使用匿名类。

示例:

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对象。

我不确定这是否是一个好的设计。我也不知道这是否有效。我无法在我的环境中运行它。

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

谢谢!


3
不知道您的具体要求,很难提供相关的设计建议。特别是,“我需要复制VB代码的结构(我们被迫这样做),我还需要在我的JAVA类中包含查询服务”似乎有些奇怪。将程序移植到另一种语言不是改善设计的理想时机吗? - meriton
我们在设计方面没有选择的余地。我们的客户提供了框架供我们使用,他们不接受任何框架变更请求。我真正需要的是尽可能地复制VB的结构和逻辑,并在Java中应用良好的设计(尽管我们的客户并不真正关心设计,只要它是他们vb系统的副本并具有相同的行为即可)。 - qaxi
1个回答

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,并拥有这样的构造函数,可以在代码中清晰地表达这种依赖关系。

我忘记了这个。这样更清晰易读。谢谢! - qaxi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接