java - 单例模式、配置和依赖注入(inject)

标签 java singleton

我目前正在将 C 库移植到 Java。 C 库连接到外部设备并提供配置设备和接收数据的函数。我的设计核心是一个 Connection 类,它封装了与设备的连接,并提供使用 JNA 生成的低级 C API 映射。

由于大多数 C 库不能很好地转换为 Java 的 OO 世界(包含 100 多个函数的单个头库),因此我有几个“管理器”类可以提供对大多数功能的访问。

创建多个此类是没有意义的,因为 C 库仅管理所有资源(配置、数据缓冲区等)的一种资源。因此,我想为我的 Java 类实现 Singleton 模式(也有效地向我的新 Java 库的用户发出信号,表明整个系统中只有一个 Manager 对象)。

此外,我希望能够使用外部配置文件配置这些管理器类。我以前从未实现过配置实用程序,所以我真的不知道该把它放在哪里。

最后,我的所有 Manager 类都需要对 Connection 对象的引用。

所以我需要一个设计,让我能够:

  1. 使我的 Java 类独一无二(单例模式)
  2. 注入(inject)我的Connection对象
  3. 使用配置文件配置我的类

有什么想法吗?

最佳答案

对于前两点,类似这样的事情就可以解决问题:

public class Connection{

    private static Connection instance = null;
    private String connectionString;

    protected Connection() {
    }

    public static Connection getInstance() {
       if(instance == null) {
          instance = new Connection();
       }
       return instance;
    }

    public void setConnectionString(String connectionString){
        this.connectionString = connectionString;
    }

    public String getConnectionString(){
        return this.connectionString;
    }
}

这是java中单例的一个经典例子。构造函数是 protected ,因此您无法使用new 关键字来实例化它。相反,您可以像这样使用它:

Connection con = Connection.getInstance();

getInstance() 负责实例化并确保单例只存在一个实例。例如,这个:

    Connection con = Connection.getInstance();
    con.setConnectionString("foobar");

    Connection con2 = Connection.getInstance();
    System.out.println(con2.getConnectionString());

将打印foobar

第三点,我建议您引用this question已经得到了解答。

关于java - 单例模式、配置和依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37928642/

相关文章:

java - HBase 内存不足错误

java - 如何将 Jooq 用于尚不存在的表?

添加 ImageLoader 时 getInstance(this) 中的 Android Volley 错误

objective-c - 设计模式建议 : Using an array of custom objects as a singleton

java - 我可以有一个接口(interface)实例吗

java - java中多种格式的日期绑定(bind)器

java - java中的内存泄漏

java - 表单提交后如何处理服务器的响应?

iOS:始终在后台运行单例实例(不同线程)

language-agnostic - 什么时候不应该使用单例模式? (除了显而易见的)