Переход от C# к Java и попытка очистки пучка утечек соединения в некотором коде.с использованием java анонимных функций для возврата значений
Для предотвращения утечек я сделал бы что-то вроде
public class DB{
public interface StatementUser{
public void useit(Statement cmd);
}
public static void UseCommand(StatementUser usingfunc){
try(Connection cnn = new Connection(...)){
cnn.open();
try(Statement stmt = new Statement(cnn)){
usingfunc(stmt);
}
}
}
static void main(string[] args){
int affected = 0;
DB.useStatement((stmt) -> {
// THIS STATEMENT IS DISALLOWED
affected = ... select/update... whatever
});
System.out.println("Records: " + affected);
}
}
Мне нравится этот делегат, потому что она обрабатывает очистку, но по-прежнему оставляет большую часть взаимодействия с данными для творчества разработчиков.
Получается, что присваивание affected
считается доступом к переменной за пределами ее области действия и не допускается. Итак, теперь я немного рад, как выполнить аналогичную операцию на Java (я хочу поддерживать общее использование объекта соединения/оператора)
Все, что я придумал, просто делает его более уродливым , поэтому я подозреваю, что просто иду по совершенно тупиковой траектории.
Что такое Java-способ сделать что-то подобное? (Я понимаю, что это может выглядеть сильно отличается, чем я жду)
Где именно недопустимый доступ к переменному? Этот подход выглядит хорошо. – Thilo
Если вы имеете в виду назначение «affected», возможно, это должно быть возвращаемое значение лямбда (в отличие от «void», которое у вас есть сейчас). В противном случае вы можете использовать обновляемый контейнерный класс (например, AtomicInteger). – Thilo
Обновляемый класс контейнера - это путь, который мне не нравился. У меня начинались видения кучки быстрых классов, которые были разбросаны по всему коду. Я не знал о существовавшем ранее «AtomicInteger», который также дает хороший интерфейс. –