【发布时间】:2015-03-02 16:04:17
【问题描述】:
我想将常用的应用程序逻辑外部化为一个名为Helper的“实用程序类”。应用程序逻辑需要其他 CDI bean 才能工作。
两种可能:
一)
@SessionScoped
class ControllerWithCdiBean {
@Inject
Helper helper;
public void doIt() {
Object result = helpder.calculate();
}
}
@RequestScoped
class Helper{
@Inject
Service anyService;
public Object calculate() {
return anyService.calc();
}
}
b)
@SessionScoped
class ControllerWithStaticCallsViaDeltaspike {
public void doIt() {
Object result = Helpder.calculate();
}
}
class Helper{
private static Service anyService = BeanProvider.getContextualReference(Service.class);
public static Object calculate() {
return anyService.calc();
}
性能怎么样?有什么显着的区别吗?两种解决方案对我来说都是可能的,一种解决方案比另一种更好吗?
一个缺点: 每个请求都会初始化 Helpder。
【问题讨论】:
-
我会选择 a。实用程序类是邪恶的
-
@SvetlinZarev 你的意思是像
java.util.Arrays、java.util.Collections这样的类和整个Apache Commons Xyz 库都是邪恶的?你肯定从来没有用过它们:) -
@LuiggiMendoza 有区别。
Arrays和Collections随 JRE 一起提供,而Helper没有。此外,过度使用静态方法(因此是实用程序类)会导致程序代码并使其难以测试。过度使用实用程序类违反 OOP 和 TDD 的原则,应尽可能避免,在 OP 的情况下,绝对可以不使用实用程序类。 -
@SvetlinZarev 很好的理论,但遗憾的是并不适用于所有现实世界的应用程序。在某些用例中,您的方法将在多个类中使用并执行相同的操作,因此最好将这些方法打包到一个类(或一组类)中,该类(或类组)不需要特定实例来使方法工作例如验证
String是否为空或null。有些人意识到这一点并在他们的库中使用它们:Apache Commons 系列:Lang、IO 等。Guava、cglib 等等。
标签: java performance cdi weld