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