Java静态字段初始化

Java静态字段初始化,java,initialization,static-methods,Java,Initialization,Static Methods,我刚刚花了半个小时弄清楚这件事,我已经设法修复了我的代码,但我不完全理解正在发生的事情,我想知道是否有人可以解释一下 我有一个utils类型的类,它包含一些静态字段(例如数据库连接端点),这些字段由各种其他程序根据手头的任务使用。基本上是一个图书馆 这是它以前的样子(虽然仍然破碎) 对searchDB的调用发生在spawnDBConnection完成之后,我已经广泛使用了标准输出来说明这一点。但是,一旦进入searchDB方法,myDBIndex的值就是null!这是一个静态字段,在spawnD

我刚刚花了半个小时弄清楚这件事,我已经设法修复了我的代码,但我不完全理解正在发生的事情,我想知道是否有人可以解释一下

我有一个utils类型的类,它包含一些静态字段(例如数据库连接端点),这些字段由各种其他程序根据手头的任务使用。基本上是一个图书馆

这是它以前的样子(虽然仍然破碎)

对searchDB的调用发生在spawnDBConnection完成之后,我已经广泛使用了标准输出来说明这一点。但是,一旦进入searchDB方法,myDBIndex的值就是null!这是一个静态字段,在spawnDBConnection结束时它不是空的,没有其他赋值,现在它是空的:(

简单的修复方法是删除“=null”,因此字段声明现在看起来像

private static DBIndex myDBIndex;

为什么会有不同?我完全被这个弄糊涂了。

这是在生成的
静态
初始化程序块中发生的情况:

static {
   myDBConnection = spawnDBConnection();
   myDBIndex = null;
}

我希望现在清楚了。

这是因为
null
myDBIndex
的赋值是在

private static DBConnection myDBConnection = spawnDBConnection();
e、 g.覆盖
spawnDBConnection

顺序是:

  • 声明字段
    myDBConnection
    myDBIndex
  • 初始化
    myDBConnection=spawnDBConnection();

    这包括调用
    spawnDBConnection
    和将返回值赋值给
    myDBConnection

  • 初始化
    myDBIndex
    (带null)
  • 在第二个示例中,第三步不存在

    为什么会有不同?我完全被这个弄糊涂了

    spawnDBConnection
    的初始值设定项正在运行,
    myDBIndex
    的初始值设定项正在运行。
    myDBIndex
    的初始值设定项将该值设置为null。由于这是在
    spawnDBConnection
    将其设置为非null值后发生的,最终结果是该值为null


    尽量不要这样做-静态初始值设定项调用的方法设置其他静态变量是很奇怪的。

    据我所知,如果您在字段开始工作之前定义了方法,则在初始化时,类从顶部解析。

    public class DbUtils {
        private static String spawnDBConnection() {
            System.out.println("database connection completed");
            return "INIT";
        }
        private static String myDBConnection = spawnDBConnection();
        private static int myDBIndex = 0;
    
        public static void main(final String[] args) {
            System.out.println(myDBConnection);
        }
    }
    
    输出:

    database connection completed
    INIT
    

    考虑一下你的静力学<代码>最终< /代码>。你将被迫分配一次,消除这种惊讶。这是一个可怕的噩梦反模式。你在这里做的事情。你正在把类初始化与数据库连接的获取耦合起来。你不应该静态地初始化dBoTrink。死了,你打算开始在代码中使用DbUtils2吗?@MarkoTopolnik我该如何使我的DBUtils类尽可能地可用(外部程序不需要代码,它们可以直接跳入并开始使用静态方法)不制造这种混乱?数据库连接管理是一项艰巨的工作,你不应该从头开始。那里有广泛使用的、经过战斗验证的连接池库。我最喜欢的是
    boneCP
    。下载它,看看吧,我想你会发现它很容易开始。谢谢你的回复,我在编写时就知道了我认为在另一个静态变量中初始化一个静态变量是一件很奇怪的事情,我只是把代码放在一起进行一些快速测试。感谢你澄清了这一点,现在它有了完美的意义。出于某种原因,我脑子里想,任何方法调用都会在“简单”赋值之后发生。
    public class DbUtils {
        private static String spawnDBConnection() {
            System.out.println("database connection completed");
            return "INIT";
        }
        private static String myDBConnection = spawnDBConnection();
        private static int myDBIndex = 0;
    
        public static void main(final String[] args) {
            System.out.println(myDBConnection);
        }
    }
    
    database connection completed
    INIT