gpt4 book ai didi

java - 在 Java 接口(interface)中使用单例

转载 作者:行者123 更新时间:2023-12-04 22:29:16 26 4
gpt4 key购买 nike

我想知道,如何将单例模式与接口(interface)一起使用?我创建了一个界面:

public interface BusinessService {

BusinessService getInstance();

}
我做了这个实现:
public class BusinessServiceImpl implements BusinessService {

private static BusinessServiceImpl instance = null;

private BusinessServiceImpl(){ }

@Override
public BusinessServiceImpl getInstance() {
if (instance == null) {
BusinessServiceImpl.instance = new BusinessServiceImpl();
}
return BusinessServiceImpl.instance;
}
}
如何从我的主类访问 getInstance?
我尝试了类似的东西
private BusinessService service = new BusinessServiceImpl();
(不起作用 - BusinessServiceImpl() 的构造函数是私有(private)的)
但还有什么?你能帮我吗?
编辑 : 我正在使用 Java Spring!我不想使用 Java Springs - 依赖注入(inject)!
问候,米拉

最佳答案

您提供的代码有点困惑。

控制单例类的实例化的全部意义在于您必须隐藏构造函数,因此客户端无法访问它并随意创建新实例。

您的工厂方法(一种创建类实例的方法)getInstance()是一个实例方法。您必须创建 BusinessService 的新实例为了创建 BusinessService 的实例- 很明显,它不能正常工作。

您有几种选择来处理您的情况:

  • 删除 getInstance()从您的接口(interface)中获取方法并将其作为静态方法在您的实现类中公开。您还应该将构造函数的可见性限制为 private .
    public class BusinessServiceImpl implements BusinessService {

    public static BusinessServiceImpl getInstance() {
    // instantiation logic
    }

    private BusinessServiceImpl() {
    // constructor logic
    }
    }
  • 使用工厂类来实例化您的服务并控制实例的数量。这包括删除 getInstance()方法一起使用并限制您的 BusinessServiceImpl 的可见性上课至package .
    class BusinessServiceImpl implements BusinessService {

    BusinessServiceImpl() {
    // constructor logic
    }
    }

    // should be in the same package as BusinessServiceImpl
    public final class BusinessServiceFactory {

    private BusinessServiceImpl instance;

    public BusinessService getInstance() {
    // instance creation logic, same as singleton creation logic
    }

    }
  • 使用枚举来处理单例逻辑。删除 getInstance()从您的界面中获取方法。
    public enum BusinessServiceImpl implements BusinessService {

    INSTANCE;

    // implement the methods from your interface
    }
  • 关于java - 在 Java 接口(interface)中使用单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39074628/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com