【发布时间】:2013-11-15 20:21:26
【问题描述】:
我在这个项目中使用了 Spring,但我在使用 Guice 时也遇到了同样的问题。
基本上,我的功能需要无状态助手和状态数据才能操作。
public class AwesomeDoer {
@Inject
private Helper helper; //stateless
...
public void doAwesome(int state) {
helper.help(state)
}
}
这看起来很不错,直到 doAwesome 有 5 个参数并被调用 1000 次,但是每次都有 3 个参数是相同的值,而第四个参数可能只更改几次。将适当的参数更改为字段是显而易见的解决方案。但是,这需要你牺牲这个类的 CDI 管理,否则你必须有一个初始化器或设置器来在 Spring 完成它的事情之后填充状态。
我通常通过创建一个由 Spring 管理的工厂来解决这个问题,即
public class AwesomeFactory {
@Inject
private Helper helper;
public AwesomeDoer getAwesomeDoer(int state) {
return new AwesomeDoer(helper, state);
}
}
但同样,这意味着我的 AwesomeDoer 不再由 Spring 管理,它需要我编写另一层非业务逻辑。也很容易想象这种方法导致了 AwesomeFactoryFactory 等的创建,这总是让我有点死心。
那么有人有更清洁的方法吗?
【问题讨论】:
-
当参数过多时,引入上下文或传输对象,如包装参数的
StateDTO或StateContext。这比使用 aop 的“解决方法”要好得多。