如果我有一个我想要初始化的静态字段,那么在构造函数中初始化它会导致每次实例化一个新的类实例时分配它吗?
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);
但是我需要进行异常处理。我也看过使用静态块,但这导致了问题。
答案 0 :(得分:3)
是否会在构造函数中初始化它,因为每次实例化一个新的类实例时都会分配它?
是;构造函数中的代码将在构造对象时运行。
您需要使用静态初始化程序块。
答案 1 :(得分:1)
静态字段属于类,而不属于该类的任何实例。因此,在构造函数中初始化它没有任何意义。因为每次创建实例,都会重新初始化。这可能会给您带来麻烦。使用静态初始化程序初始化它们,并为静态字段设置类加载时间初始化程序。
答案 2 :(得分:0)
您应该使用静态构造函数来初始化需要更多初始化的静态变量,而不仅仅是简单的赋值。当然,您只能在静态构造函数中使用静态变量。以你的例子:
class Database {
private static Connection connection;
static {
try {
connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);
} catch (...) {}
}
...
}
在这个例子中,HOST,USERNAME和PASSWORD也需要是静态变量(在这个类或其他地方都可以)。但是,我怀疑你真的想要像这样初始化你的数据库。
答案 3 :(得分:0)
是的,这就是静态字段的工作原理。它们在您班级的所有实例中共享;只要您拨打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
实例时执行)。
答案 4 :(得分:0)
跨多个实例使用静态Connection对象是不安全的 Related stackoverflow question