簡體   English   中英

在不同類別之間共享對象

[英]sharing object across different classes

我需要一些“設計”建議。 我有靜態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

挺好的,但是如果我想對正在使用db1db2類進行單元測試,則如果從單元測試中不執行MainClass.dbConnect()則會得到空指針異常

更糟糕的是-從測試類中,我什至需要一個不同的數據庫設置,因此在Test.class我需要:

Main.db1 = JdbcFactory.getInstance("db/config/test/db1.properties");

總的來說,這很混亂,我不喜歡。 沒有更好的方法共享db1db2嗎?

另外,從java run參數定義的boolean makeDirectConnection阻止我使用final db1db2 任何建議如何解決此問題? (這取決於執行程序的環境-但我不想使其依賴於主機名或其他操作系統。

我不會提供布爾值作為jvm參數來區別您的兩種(或三種)情況。 相反,我將通過參數提供數據庫URL。 在這種情況下,您還可以使用“ test-db.properties”在測試中調用您的方法。

由於需要為測試和部署分別設置默認實例。 因此,創建一個屬性文件 ,其中提到應使用哪個文件來創建db1db2默認實例。

要消除從單元測試代碼中調用MainClass.dbConnect()的需要,只需創建一個靜態塊,然后在此處使用默認值初始化db1db2 例如,如果屬性文件是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"));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM