【问题标题】:Loading the class only once只加载一次类
【发布时间】:2011-04-12 00:52:01
【问题描述】:
  1. 我正在实施一个使用第三方提供商服务的服务类。
  2. 用户将与Service类进行交互以获取服务提供者的服务。

我的要求:
我只想加载一次服务类(或者它会在内存中持续很长时间,比如 2 小时)。
我的问题:
如何检查该服务类是否只加载一次?
如果每次发出请求时都会加载它,那么有什么办法可以让它们持久存在内存中?


这是我的服务类的代码

包 com.example; 导入 com.example.spi.Multiplication; 导入 java.util.Iterator; 导入 java.util.ServiceLoader; 公共类 MultiplicationService 实现乘法{ 私有静态 MultiplicationService 服务; 私有 ServiceLoader 加载器; 公共静态int no = 0; 私人乘法服务(){ loader = ServiceLoader.load(Multiplication.class); } 公共静态同步 MultiplicationService getInstance() { 如果(服务==空){ 服务 = 新的乘法服务(); } 退货服务; } 公共 int getMultiplication(int a,int b){ 整数结果 = 0; 尝试 { 迭代器乘法 = loader.iterator(); while (result == 0 && multiply.hasNext()) { 乘法 d = multiply.next(); 结果 = d.getMultiplication(a,b); System.out.println("结果是:"+结果); } } 捕捉(异常服务错误){ 结果 = 0; serviceError.printStackTrace(); } 返回结果; } }

谢谢

【问题讨论】:

    标签: java


    【解决方案1】:

    您可以实现singleton pattern。一种选择是使用枚举:

    public enum Service {
        INSTANCE;
    
        private ThirdPartyService service = new ThirdPartyService();
    
        public ThirdPartyService getService() {
            return service;
        }
    }
    

    但不要过度使用该模式,因为它会使您的代码难以进行单元测试。

    【讨论】:

    【解决方案2】:

    Spring
    创建一个 bean 条目并将其保持为单例 [默认情况下]
    初始化上下文时,它将创建该类的一个对象,然后它不会触及该类,您的目的将得到解决。

    【讨论】:

      【解决方案3】:

      您还可以查看OSGi,它有一个服务模型,会为您处理所有类加载。您也可以combine it with Spring 获得两全其美的好处。

      【讨论】:

        猜你喜欢
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 2022-08-23
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多