Java 性能:实用程序类与CDIBean

Java 性能:实用程序类与CDIBean,java,performance,cdi,weld,Java,Performance,Cdi,Weld,我想将常用的applicationlogic外部化为一个名为Helper的“实用程序类”。applicationlogic需要其他CDIBean才能工作 两种可能性: (a) (b) 性能如何?有什么显著的区别吗?两种解决方案对我来说都是可能的,一种解决方案比另一种好吗 一个缺点: 每个请求都会初始化帮助程序。将你的帮助程序类标记为@ApplicationScoped。这样,每个应用程序上下文将有一个实例 尽管如此,如果它只是一个实用程序类,那么它不应该是一个托管bean。相反,我会将它标记为f

我想将常用的applicationlogic外部化为一个名为Helper的“实用程序类”。applicationlogic需要其他CDIBean才能工作

两种可能性:

(a)

(b)

性能如何?有什么显著的区别吗?两种解决方案对我来说都是可能的,一种解决方案比另一种好吗

一个缺点:
每个请求都会初始化帮助程序。

将你的
帮助程序
类标记为
@ApplicationScoped
。这样,每个应用程序上下文将有一个实例


尽管如此,如果它只是一个实用程序类,那么它不应该是一个托管bean。相反,我会将它标记为
final
,定义一个
private
构造函数,并将所有方法标记为
static
。这是因为它是一个实用程序类,不需要维护任何状态。

我会选择一个。实用程序类是evil@SvetlinZarev你的意思是像
java.util.array
java.util.Collections
和整个ApacheCommons Xyz库这样的类是邪恶的?你肯定从来没有用过:)@LuiggiMendoza有区别<代码>数组
集合
随JRE一起提供,而
助手
不随JRE提供。此外,过度使用静态方法(因此是实用程序类)会导致过程代码,并使测试变得困难。过度使用实用程序类违反了OOP和TDD的原则,在可能的情况下,应避免使用,在OP的情况下,应避免使用;SvetlinZarev很好的理论,但遗憾的是并不适用于所有现实世界的应用程序。在一些用例中,您的方法将在多个类中使用,并执行相同的操作,因此最好将这些方法打包到一个类(或一组类)中,而不需要特定的实例来使方法工作,例如验证
字符串是否为空或
null
。有人知道这一点,并在他们的库中使用它们:Apache Commons系列:Lang、IO等。Guava、cglib等。由于我注入了引用(=代理),所以“私有静态服务anyService”会出现问题吗只对一个CDIBean执行一次操作,并让它在助手的整个生命周期内运行?那么您就没有实用程序类,只有一个代理类。如果这是您的目的,那么使用方法A并将您的代理标记为
@ApplicationScoped
。。。但毕竟,我认为,我的助手不仅仅是这个。它包含“更多”逻辑,但并非在所有情况下都可重用。因此,我宁愿采用方法a)并使其@ApplicationScope。这在组件测试中具有优势,尽管有像Powermock这样的框架可以使测试静态方法变得容易。
@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();
  }
}
@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();
  }