Java 单例模式、配置和依赖注入
我目前正在将一个C库移植到Java。C库连接到外部设备,并提供配置设备和接收数据的功能。我设计的核心是一个Java 单例模式、配置和依赖注入,java,singleton,Java,Singleton,我目前正在将一个C库移植到Java。C库连接到外部设备,并提供配置设备和接收数据的功能。我设计的核心是一个连接类,它封装到设备的连接,并提供使用JNA生成的低级C API映射 由于大多数C库不能很好地转换到Java的OO世界(包含100多个函数的单头库),我有两个“管理器”类,它们提供了对大多数功能的访问 创建多个这样的类是没有意义的,因为C库只管理一个资源(配置、数据缓冲区等)。所以我想为我的Java类实现Singleton模式(有效地也向我的新Java库的用户发出信号,整个系统中只有一个Ma
连接
类,它封装到设备的连接,并提供使用JNA生成的低级C API映射
由于大多数C库不能很好地转换到Java的OO世界(包含100多个函数的单头库),我有两个“管理器”类,它们提供了对大多数功能的访问
创建多个这样的类是没有意义的,因为C库只管理一个资源(配置、数据缓冲区等)。所以我想为我的Java类实现Singleton模式(有效地也向我的新Java库的用户发出信号,整个系统中只有一个Manager对象)
此外,我希望能够使用外部配置文件配置这些管理器类。我以前从未实现过配置实用程序,所以我真的不知道该放在哪里
最后,我的所有管理器类都需要对连接
对象的引用
因此,我需要一种设计,使我能够:
连接
对象有什么想法吗?对于前两点,类似这样的方法可以达到目的:
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(){…}
public final class Connection {
private static class Holder {
private static final Connection INSTANCE = new Connection();
}
private Connection() {}
public static Connection getInstance() {
return Holder.INSTANCE;
}
}
公共同步静态连接getInstance(){…}
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配置对象?您可以用于配置:这正是我所需要的。谢谢;-)