Как я могу использовать intellij для реорганизации поля в попытку с ресурсами

Этот вопрос похож на В IntelliJ IDEA, как окружить с помощью try-with-resources? но разница в том, что у меня есть поле, а не локальная переменная. Мой код выглядит так:

    preparedStatement = connect.prepareStatement(sqlQuery);
    preparedStatement.setInt(1, 1);
    preparedStatement.setString(2, "foo");
    preparedStatement.setString(3, "bar");
    preparedStatement.setString(4, "baz");
    preparedStatement.setDouble(5, 0);
    preparedStatement.setDouble(6, 0);
    preparedStatement.setString(7, foovar);
    preparedStatement.setString(8, barvar);
    preparedStatement.executeUpdate();

    preparedStatement = connect.prepareStatement(sqlQuery);
    preparedStatement.setInt(1, 1);
    preparedStatement.setString(2, "foo2");
    preparedStatement.setString(3, "bar2");
    preparedStatement.setString(4, "baz2");
    preparedStatement.setDouble(5, 0);
    preparedStatement.setDouble(6, 0);
    preparedStatement.setString(7, foovar2);
    preparedStatement.setString(8, barvar2);
    preparedStatement.executeUpdate();

Я хотел бы обернуть каждый из них, чтобы он выглядел так:

    try (PreparedStatement preparedStatement = connect.prepareStatement(sqlQuery)) {
        preparedStatement = connect.prepareStatement(sqlQuery);
        preparedStatement.setInt(1, 1);
        preparedStatement.setString(2, "foo");
        preparedStatement.setString(3, "bar");
        preparedStatement.setString(4, "baz");
        preparedStatement.setDouble(5, 0);
        preparedStatement.setDouble(6, 0);
        preparedStatement.setString(7, foovar);
        preparedStatement.setString(8, barvar);
        preparedStatement.executeUpdate();
}

    try (PreparedStatement preparedStatement = connect.prepareStatement(sqlQuery)) {
        preparedStatement = connect.prepareStatement(sqlQuery);
        preparedStatement.setInt(1, 1);
        preparedStatement.setString(2, "foo2");
        preparedStatement.setString(3, "bar2");
        preparedStatement.setString(4, "baz2");
        preparedStatement.setDouble(5, 0);
        preparedStatement.setDouble(6, 0);
        preparedStatement.setString(7, foovar2);
        preparedStatement.setString(8, barvar2);
        preparedStatement.executeUpdate();
}

И мне бы очень хотелось сделать это, используя только ярлыки рефакторинга IDE. Это возможно? На мой взгляд, самая сложная часть — превратить это поле в локальную переменную. Как только я это сделаю, я думаю, что смогу понять остальное.


person Daniel Kaplan    schedule 06.02.2018    source источник
comment
если вы знакомы с vim, вы можете использовать плагин idea vim для выполнения этой работы с помощью макроса.   -  person snap    schedule 07.02.2018
comment
@snap, что к этому добавляет Intellij? Будет ли разница между этим и просто использованием макроса?   -  person Daniel Kaplan    schedule 07.02.2018
comment
нет, его можно использовать непосредственно внутри идеи. на самом деле это менее мощно, чем делать это непосредственно в vim.   -  person snap    schedule 07.02.2018
comment
@snap менее мощный в каком смысле?   -  person Daniel Kaplan    schedule 07.02.2018
comment
Это просто эмулируемое подмножество vim и не поддерживает все функции vim. И вы не сможете добавить к нему плагины (но у него есть уже интегрированные окружения). не поймите меня неправильно, идея плагина vim действительно крутая, но для действительно сложных вещей я должен переключиться на настоящий vim. но для этой цели это должно работать очень хорошо. здесь вы можете прочитать обо всех поддерживаемых функциях: plugins.jetbrains.com/plugin/164-ideavim   -  person snap    schedule 07.02.2018


Ответы (1)


Я не верю, что это возможно, так как этот рефакторинг может иметь неблагоприятные последствия для любого другого пользователя соединения.

Учитывая, что ваше соединение находится в более высокой области, чем метод, само собой разумеется, что могут быть другие нижестоящие пользователи этого экземпляра соединения. Имея это в виду, если есть возможность других нижестоящих пользователей, закрытие соединения из-под их ног приведет к неожиданному или ненормальному поведению.

IntelliJ заявляет здесь, что ее анализатор кода не может надежно гарантировать, что эта переменная не используется каким-либо другим нижестоящим потребителем. Вы можете запросить это как функцию.

Лично мне нравится, когда не это происходит, поскольку это избавляет разработчика от невероятной глупости, которую он не осознает.< / суп>

person Makoto    schedule 06.02.2018
comment
Круто, это имеет смысл. Я бы не хотел просить об этом по этой причине. Может быть, здесь мне поможет структурный поиск и замена? Да, именно из-за этой ошибки я и задаю вопрос ;) - person Daniel Kaplan; 07.02.2018
comment
Я думаю, что перестройка соединений может быть полезной. Вместо того, чтобы напрямую использовать соединение экземпляра, проведите его рефакторинг, чтобы можно было вернуть Supplier<Connection>, который обеспечивает относительно новое соединение. - person Makoto; 07.02.2018
comment
Думаю, я неправильно понял. Где массовый баг? Я думал, что это из-за того, что не закрыли заявление. Похоже, вы говорите, что ошибка заключается в прямом использовании соединения. Я использую DBCP, и его примеры делают это. - person Daniel Kaplan; 07.02.2018
comment
На самом деле игнор. Это я интерполировал PreparedStatement как Connection. - person Makoto; 07.02.2018