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;
В приведенном выше коде, если я удаляю final из одной из переменных, которые я использую для установки PreparedStatement
, он говорит "" is accessed from within inner class, needs to be declared final
.
Я понимаю, что java предупреждает меня объявить final, поэтому я не могу изменить переменную позже и сломать PreparedStatementCreater, экземпляр которого я только что сделал. Я читал похожие темы в stackoverflow, но до сих пор не могу понять. Я проверил функцию ps.setInt
, ее аргументы имеют тип int
. Поэтому они передаются по значению. Я просто не могу изменить их значение в любом случае. Я действительно не понимаю, почему меня предупреждают здесь. Можете ли вы помочь мне понять?
PreparedStatement
. Вы используете эту переменную в анонимном классе, поэтому она должна быть окончательной. Прочтите этот ответ для получения дополнительной информации. - person Tom   schedule 30.11.2014