繁体   English   中英

在构造函数中初始化静态字段

[英]Initializing static fields in the constructor

如果我有一个要初始化的静态字段,是否会在每次实例化该类的新实例时在构造函数中对其进行初始化?

    private static Connection connection;

    public Database() {
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);

    } catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

我可以这样做:

    private static Connection connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);

但是我需要进行异常处理。 我还研究了使用静态块,但这引起了问题。

在构造函数中初始化它会导致它在每次实例化该类的新实例时被分配?

是; 每当您构造一个对象时,构造函数中的代码就会运行。

您需要使用静态初始化程序块。

静态字段属于类,而不属于该类的任何实例。 因此,在构造函数中对其进行初始化没有任何意义。 因为对于每个实例创建,都将重新初始化。 这可能会给您带来麻烦。 使用静态初始值设定项对其进行初始化,并为静态字段提供类加载时间初始值设定项。

您应该使用静态构造函数来初始化静态变量,这些静态变量需要的初始化不仅仅是简单的赋值。 当然,您只能在静态构造函数中使用静态变量。 例如:

class Database {
    private static Connection connection;

    static {
        try {
            connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);
        } catch (...) {}
    }

    ...
}

在此示例中,主机,用户名和密码也必须是静态变量(在此类或其他地方也可以)。 但是,我怀疑您是否真的想像这样初始化数据库。

是的,这就是静态字段的工作方式。 它们在您课程的所有实例之间共享; 每当您调用new Database() ,它将重置连接。

对于数据库,应使用连接池而不是单个共享连接。

您想要的是一个静态初始化器:

static {
    try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);

        } catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

第一次触摸静态字段时将执行此块(这将在创建新的Database实例时执行)。

在多个实例之间使用静态Connection对象是不安全的。
相关stackoverflow问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM