【发布时间】:2014-12-01 01:55:43
【问题描述】:
final int receiverUserId = sendMessageRequest.getReceiverUserId();
final int senderUserId = sendMessageRequest.getSenderUserId();
final int replyTo = sendMessageRequest.getReplyTo();
final int subsiteId = sendMessageRequest.getRelatedSubsiteId();
final String message = sendMessageRequest.getMessage();
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplateObject.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps =
connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, senderUserId);
ps.setInt(2, receiverUserId);
ps.setInt(3, replyTo);
ps.setInt(4, subsiteId);
ps.setString(5, message);
return ps;
}
},
keyHolder
);
return true;
在上面的代码中,如果我从用于设置PreparedStatement 的变量之一中删除final,它会显示"" is accessed from within inner class, needs to be declared final。
我知道 java 警告我声明 final,所以我不能稍后更改变量并破坏我刚刚创建实例的 PreparedStatementCreater。我已经在 stackoverflow 中阅读过类似的主题,但我仍然无法理解。我检查了函数ps.setInt,它的参数类型是int。所以它们是按值传递的。无论如何,我无法改变它们的价值。我真的不明白为什么我在这里收到警告。你能帮我理解吗?
【问题讨论】:
-
与
PreparedStatement无关。您在匿名类中使用该变量,这就是为什么它必须是最终的。阅读this answer了解更多信息。
标签: java sql prepared-statement inner-classes