gpt4 book ai didi

java - Spring 匿名/回调类用于数据持久化的困难时期

转载 作者:行者123 更新时间:2023-12-01 16:01:23 29 4
gpt4 key购买 nike

我正在尝试适应 Spring JDBC,但让我烦恼的是使用这些匿名类,我们不能传递任何局部变量,除非它们是最终的,这可能很容易安排,但是如果我需要循环一个怎么办?数组还是集合?我无法将“FedModel fm”声明为最终的,因为它在循环中重新初始化,但我需要调用执行方法 100 次。这是我遇到问题的具体场景,因为我不知道如何将 BLOB 插入数据库的任何其他方法。

 for (int i = 0; i < fedModels.size(); i++) {
FedModel fm = fedModels.get(i);

jdbcTemplate.execute("INSERT INTO items (name, video_blob) VALUES (?, ?)",
new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
protected void setValues(PreparedStatement ps, LobCreator lobCreator)
throws SQLException {
ps.setString(1, fm.getName());
ps.setString(2, fm.getDifficultyLevel());
ps.setString(3, fm.getEquipment());
lobCreator.setBlobAsBinaryStream(ps, paramIndex, contentStream, contentLength);
}
});

}

我唯一能想到的就是创建一个静态嵌套类,它扩展 AbstractLobCreatingPreparedStatementCallback 并添加 fedModels 的构造函数,以便我可以在内部执行循环。但仅使用 JDBC 会更容易。

最佳答案

... but what bugs me is using these anonymous classes, where we cannot pass any local variables unless they are final ...

这不是 Spring 的错。它是 Java 编程语言的属性。

基本上,Java 语言(至少是 Java 6 及更早版本)不支持闭包,闭包允许匿名类实例访问和更新实例封闭范围内的局部变量。作为解决方法,该语言允许您访问 final 封闭的局部变量。这是通过将相应变量的值复制到匿名类实例中并将它们存储在隐藏变量中来实现的(没有闭包)。

在您的特定情况下,简单的解决方案是将 fm 声明为 final。如果需要访问匿名类中的循环变量,可以声明一个最终副本;例如

for (int i = 0; i < 10; i++) {
final int ii = i;
new Thread(new Runnable(){
public void run() {
System.err.println(ii);
}
}).start();
}

关于java - Spring 匿名/回调类用于数据持久化的困难时期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3792165/

29 4 0