什么是静态块?它是匿名方法还是什么?如何以及何时执行?我能简要介绍一下这里发生了什么吗?
public class UserDAO {
private static Connection connection;
static {
String url = null;
String username = null;
String password = null;
try (InputStream in = UserDAO.class.getClassLoader()
.getResourceAsStream("persistence.properties")) {
Properties properties = new Properties();
properties.load(in);
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
try {
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection(url, username, password);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
这种构造称为静态初始化块,它在类加载器加载类时执行一次。
具体来说,在您的示例中,静态初始化块创建一个连接并将指向它的链接保存在静态字段中。
通常,静态会产生问题。因为 重新初始化它通常不是微不足道的,如果不是不可能的话。
如果由于某种原因在加载程序时没有创建连接,您将不得不以其他方式再次调用连接过程,因为没有黑魔法就无法再次执行静态初始化块。
使用静态和静态初始化的类更加困难,在某些情况下不可能定性地涵盖单元测试。因为 执行测试的代码无法控制静态字段,特别是如果它被隔离
private,甚至更糟private final,或者没有办法不执行静态初始化块---
最好替换这种情况,例如,用一个单独的类,这将是它的职责范围,而 DAO 在构建过程中反过来会收到对它的引用。在某些春天,这将是一个带有 annotation 的字段,由容器
@Autowired初始化DI,或者最坏的情况是作为构造函数参数或 setter。听起来可能不那么优雅,但是,有些工具很危险或隐藏隐藏的问题,静力学就是这样的工具。