我剛剛花了半小時弄清楚這件事情,我已經設法修復了我的代碼,但是我並不完全理解正在發生的事情,並想知道是否有人可以闡明它。Java靜態字段初始化
我有一個utils的類型的類,它包含由根據手頭的任務其他多種程序使用了一些靜態字段(例如數據庫連接的端點)。本質上是一個圖書館。
這是它以前的樣子(雖然還是壞了);
//DBUtils.java
public final class DBUtils {
private static DBConnection myDBConnection = spawnDBConnection();
private static DBIndex myDBIndex = null;
private static DBConnection spawnDBConnection() {
//connect to the database
//assign a value to myDBIndex (by calling a method on the DBConnection object) <- IMPORTANT
//myDbIndex NOT NULL HERE
System.out.println("database connection completed");
//return the DBConnection object
}
public static searchDB(String name) {
//use the myDBIndex to find a row and return it
}
}
所以簡單地說,我使用的是靜態spawnDBConnection()方法來分配一個值都myDBConnection和myDBIndex。這是完美的,我的程序中的第一個輸出行始終是「數據庫連接已完成」,在spawnDBConnection()方法結束時,myDBConnection或myDBIndex都不爲null,所有內容都應該如此。
我的外部程序看起來像這樣;
//DoSomethingUsefulWithTheDatabase.java
public final class DoSomethingUsefulWithTheDatabase {
public static void main(String args[]) {
DBUtils.searchDB("John Smith"); //fails with NullPointerException on myDBIndex!
}
}
這次調用searchDB發生在spawnDBConnection結束後,我已經使用了標準輸出廣泛,顯示這一點。但是,一旦進入searchDB方法,myDBIndex的值就是null!它是一個靜態字段,並且在spawnDBConnection結束時它不爲空,現在沒有其他任務了,現在它是空的:(
簡單的修復方法是刪除「= null」,所以現在的字段聲明看起來像等;
private static DBIndex myDBIndex;
爲什麼有所作爲,我徹底被這個迷惑
考慮制定你的靜態'最後'。你將被迫分配一次,消除這種驚喜。 – 2012-07-24 12:52:47
這是一個可怕的噩夢 - 反模式你在這裏做什麼。您將類初始化耦合到數據庫連接的獲取。 – 2012-07-24 12:54:28
您不應靜態初始化DBConnection。如果myDBConnection死了,你會在代碼中開始使用DbUtils2嗎? – 2012-07-24 12:58:32