Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单例模式、配置和依赖注入_Java_Singleton - Fatal编程技术网

Java 单例模式、配置和依赖注入

Java 单例模式、配置和依赖注入,java,singleton,Java,Singleton,我目前正在将一个C库移植到Java。C库连接到外部设备,并提供配置设备和接收数据的功能。我设计的核心是一个连接类,它封装到设备的连接,并提供使用JNA生成的低级C API映射 由于大多数C库不能很好地转换到Java的OO世界(包含100多个函数的单头库),我有两个“管理器”类,它们提供了对大多数功能的访问 创建多个这样的类是没有意义的,因为C库只管理一个资源(配置、数据缓冲区等)。所以我想为我的Java类实现Singleton模式(有效地也向我的新Java库的用户发出信号,整个系统中只有一个Ma

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

由于大多数C库不能很好地转换到Java的OO世界(包含100多个函数的单头库),我有两个“管理器”类,它们提供了对大多数功能的访问

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

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

最后,我的所有管理器类都需要对
连接
对象的引用

因此,我需要一种设计,使我能够:

  • 使我的Java类独一无二(单例模式)
  • 插入我的
    连接
    对象
  • 使用配置文件配置我的类

  • 有什么想法吗?

    对于前两点,类似这样的方法可以达到目的:

    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中单例的一个经典示例。构造函数受
    保护
    ,因此不能使用
    new
    关键字对其进行实例化。相反,您可以这样使用它:

    Connection con = Connection.getInstance();
    
    getInstance()
    负责实例化,并确保您的singleton只存在一个实例。例如:

        Connection con = Connection.getInstance();
        con.setConnectionString("foobar");
    
        Connection con2 = Connection.getInstance();
        System.out.println(con2.getConnectionString());
    
    将打印
    foobar


    关于第三点,我想请你谈谈已经得到答复的地方

    对于前两点,类似这样的方法可以达到目的:

    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;
        }
    }
    
    public static Connection getInstance() {
           if(instance == null) {
              instance = new Connection();
           }
           return instance;
    }
    
    这是java中单例的一个经典示例。构造函数受
    保护
    ,因此不能使用
    new
    关键字对其进行实例化。相反,您可以这样使用它:

    Connection con = Connection.getInstance();
    
    getInstance()
    负责实例化,并确保您的singleton只存在一个实例。例如:

        Connection con = Connection.getInstance();
        con.setConnectionString("foobar");
    
        Connection con2 = Connection.getInstance();
        System.out.println(con2.getConnectionString());
    
    将打印
    foobar

    关于第三点,我想请你谈谈已经得到答复的地方

    public static Connection getInstance() {
           if(instance == null) {
              instance = new Connection();
           }
           return instance;
    }
    
    此实现违反了单例原则。考虑使用两个惰性初始化方法之一:

  • 使用同步关键字
    公共同步静态连接getInstance(){…}

  • initon-demand-holder习惯用法

    public final class Connection {
    
        private static class Holder {
            private static final Connection INSTANCE = new Connection();
        }
    
        private Connection() {}
        public static Connection getInstance() { 
            return Holder.INSTANCE;
        }
    }
    
  • 为此,init on-demand holder习惯用法是一个懒惰的同步单例,比第一个使用synchronized关键字的解决方案性能更好

    此实现违反了单例原则。考虑使用两个惰性初始化方法之一:

  • 使用同步关键字
    公共同步静态连接getInstance(){…}

  • initon-demand-holder习惯用法

    public final class Connection {
    
        private static class Holder {
            private static final Connection INSTANCE = new Connection();
        }
    
        private Connection() {}
        public static Connection getInstance() { 
            return Holder.INSTANCE;
        }
    }
    

  • 对于这一点,init on demand holder习惯用法是一个懒惰的同步单例,比第一个使用synchronized关键字的解决方案性能更好。

    我实际上说的是将连接注入另一个对象,但我想我也可以使用setter注入。您将配置(设计方面)放在哪里?可能是一个配置类,它读取配置文件并将其解析为某种数据结构。然后使用公共getter和setter配置对象?您可以用于配置:这正是我所需要的。谢谢;-)我实际上是在说将连接注入另一个对象,但我想我也可以使用setter注入。您将配置(设计方面)放在哪里?可能是一个配置类,它读取配置文件并将其解析为某种数据结构。然后使用公共getter和setter配置对象?您可以用于配置:这正是我所需要的。谢谢;-)