Java 初始化构造函数中的静态字段
如果我有一个要初始化的静态字段,在构造函数中初始化它会导致每次实例化类的新实例时都分配它吗Java 初始化构造函数中的静态字段,java,static,variable-assignment,Java,Static,Variable Assignment,如果我有一个要初始化的静态字段,在构造函数中初始化它会导致每次实例化类的新实例时都分配它吗 private static Connection connection; public Database() { try { Class.forName("com.mysql.jdbc.Driver").newInstance(); connection = DriverManager.getConnection(HOST, USERNAME,
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);
但是,我需要有异常处理。我还研究了使用静态块来解决问题,但这已经造成了问题
在构造函数中初始化它会导致每次实例化类的新实例时都分配它吗
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;
public Database() {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);
} catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
}
对,;每当构造对象时,构造函数中的代码都将运行
您需要使用静态初始值设定项块。静态字段属于类,而不属于该类的任何实例。因此,在构造函数中初始化它没有任何意义。因为对于每个实例创建,都将重新初始化。这可能会给您带来问题。使用静态初始值设定项对其进行初始化,并为静态字段设置类加载时间初始值设定项。静态字段属于类,而不属于该类的任何实例。因此,在构造函数中初始化它没有任何意义。因为对于每个实例创建,都将重新初始化。这可能会给您带来问题。使用静态初始值设定项对其进行初始化,并为静态字段使用类加载时间初始值设定项。您应该使用静态构造函数来初始化需要更多初始化而不仅仅是简单赋值的静态变量。当然,您只能在静态构造函数中使用静态变量。例如:
class Database {
private static Connection connection;
static {
try {
connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);
} catch (...) {}
}
...
}
在本例中,主机、用户名和密码也需要是静态变量(在这个类中或其他地方可以)。但是,我怀疑您是否真的想这样初始化数据库。您应该使用静态构造函数来初始化静态变量,这些静态变量需要更多的初始化,而不仅仅是一个简单的赋值。当然,您只能在静态构造函数中使用静态变量。例如:
class Database {
private static Connection connection;
static {
try {
connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);
} catch (...) {}
}
...
}
在本例中,主机、用户名和密码也需要是静态变量(在这个类中或其他地方可以)。但是,我怀疑您是否真的想这样初始化数据库。是的,静态字段就是这样工作的。它们在类的所有实例中共享;无论何时调用
newdatabase()
,它都会重置连接
对于数据库,应该使用连接池,而不是单个共享连接
您需要的是静态初始值设定项:
static {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);
} catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
此块在您第一次触摸静态字段时执行(将在您创建新的
数据库实例时执行)。是的,静态字段就是这样工作的。它们在类的所有实例中共享;无论何时调用newdatabase()
,它都会重置连接
对于数据库,应该使用连接池,而不是单个共享连接
您需要的是静态初始值设定项:
static {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD);
} catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
此块在您第一次触摸静态字段时执行(将在您创建新的数据库实例时执行)。跨多个实例使用静态连接对象是不安全的。
跨多个实例使用静态连接对象是不安全的。
但这会导致问题。
???只是不要使用静态的成员/初始值设定项。用物体做任何事情。不,我只是从效率的角度考虑。我不想实例化一个新的连接对象并为每个实例分配它。如果需要,可以使用静态
初始值设定项或静态方法(最好是imho,因为您可以命名您的方法)。问题是什么?难道你不能创建一个连接对象并使用DI将它传递给每个需要它的类吗?无需使用静态
,而且更易于测试。但这会导致问题。
???只是不要使用静态
成员/初始值设定项。用物体做任何事情。不,我只是从效率的角度考虑。我不想实例化一个新的连接对象并为每个实例分配它。如果需要,可以使用静态
初始值设定项或静态方法(最好是imho,因为您可以命名您的方法)。问题是什么?难道你不能创建一个连接对象并使用DI将它传递给每个需要它的类吗?无需静态
,而且更易于测试。