Java 跨不同类共享对象

Java 跨不同类共享对象,java,jdbc,Java,Jdbc,我需要一些“设计”建议。我有静态JDBC对象和我的“主入口类”,它们在其他类中共享 我的MainClass如下所示: public static Jdbc db1; public static Jdbc db2; connectDb(makeDirectConnection) // depending on runtime passed argument public static connectDb(boolean makeDirectConnection) { if(makeDirect

我需要一些“设计”建议。我有静态JDBC对象和我的“主入口类”,它们在其他类中共享

我的
MainClass
如下所示:

public static Jdbc db1;
public static Jdbc db2;

connectDb(makeDirectConnection) // depending on runtime passed argument

public static connectDb(boolean makeDirectConnection) {
if(makeDirectConnection) // use direct connection
    db1 = JdbcFactory.getInstance("db/config/main/db1.properties");
    db2 = JdbcFactory.getInstance("db/config/main/db2.properties");
} else { // connect using via SSH tunnel (different host and port)
    db1 = JdbcFactory.getInstance("db/config/tunnel/db1.properties");
    db2 = JdbcFactory.getInstance("db/config/tunnel/db2.properties");
}
JdbcFactory
维护实例的
Map

它可以正常工作,但是如果我想对使用了
db1
db2
的类进行单元测试,如果我没有从单元测试中执行
MainClass.dbConnect()

更糟糕的是,从测试类中,我需要更多不同的DB设置,因此从
test.class
中,我需要:

Main.db1 = JdbcFactory.getInstance("db/config/test/db1.properties");
总之,这里很乱,我不喜欢。有没有更好的方法来共享
db1
db2


另外,从java运行参数定义的
boolean makeDirectConnection
阻止我使用
final
db1
db2
。如何解决这个问题有什么建议吗?(这取决于程序执行的环境-但我不想让它依赖于主机名或其他操作系统。

我不会提供一个布尔值作为jvm参数来区分两个(或三个)相反,我将通过参数提供db URL。在这种情况下,您还可以在测试中使用“test db.properties”调用您的方法.

因为您需要为测试和部署设置不同的默认实例。所以创建一个文件,其中提到应该使用哪个文件为
db1
db2
创建默认实例

要从单元测试代码中删除调用
MainClass.dbConnect()
的需要,只需创建一个静态块,然后在这里使用默认值初始化
db1
db2
。例如,如果属性文件是
defaultDB.properties
,并且具有以下内容:

DB1=db/config/test/db1.properties
DB2=db/config/test/db2.properties
然后使用以下命令:

static private Properties prop;
static {
    prop = new Properties();
    prop.load(new FileInputStream("defaultDB.properties"));
    db1 = JdbcFactory.getInstance(prop.getProperty("DB1"));
    db2 = JdbcFactory.getInstance(prop.getProperty("DB2"));
}
您可以使用包含这些连接的不可变(即没有setters之类的mutator方法)对象。该对象可以由工厂对象或方法创建,主类或测试可以调用该对象。然后根据需要传递该对象。