我刚刚花了半小时弄清楚这件事情,我已经设法修复了我的代码,但是我并不完全理解正在发生的事情,并想知道是否有人可以阐明它。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