java-最终尝试通过codestyle / checkstyle紧密自动重构为try-with-resources

我现在在一家公司工作,直到大约一年前才使用Java 1.6.他们切换到1.7,但是仍然有很多重构工作要做​​(我希望1.8很快会在议程中).

Eclipse中,我们将Checkstyle插件用于跨项目的相同代码样式.今天我们同意这样的构造:

Connection conn = null;
try{
    conn = new Connection();
    ...
} catch(Exception ex){
    ...
} finally{
    if (conn != null){
        conn.close();
    }
}

应该重写为Java 1.7以后的try-with-resources:

try(Connection conn = new Connection()){
    ...
} catch(Exception ex){
    ...
}

Checkstyle插件(或者可能是Eclipse本身的原生插件)是否可以自动将旧版本重构为新版本?我个人有C#背景并且习惯了using(Connection conn = new Connection()){…},所以我很高兴在这里使用try-with-resources,我希望1.8会很快推出以及添加(得爱一些LINQ:D).

如果有人知道Eclipse中有一种自动方法可以将try-finally结构更改为try-with-resources,我将不胜感激(最好使用Checkstyle插件或本机Eclipse).

解决方法:

很难迅速改变这一切.请注意,有时最后还有另一个try-catch块,它捕获关闭资源时抛出的异常.

try-with-resources语句确实允许您处理资源关闭异常(在close方法中抛出的异常将被抑制).

我还没有听说过这种Eclipse功能,但是如果您仅出于此目的而使用IntelliJ IDEA Community Edition IDE.

#1

您可以使用以下代码检查功能:

>“最终尝试”可替换为具有资源的“尝试”.
>自动关闭功能,无需“尝试”使用资源

您应该只按Ctrl Alt Shift,输入检查名称,然后按Enter.之后,您将看到IDEA可以应用此模式的地方,但是请注意,它不涵盖100%的情况.

#2

另一种方法,难度更大但可高度自定义的是“结构搜索和替换”功能.您可以在那里定义要更改的结构:

try {
    $type$$objectName$= new $concreteType$($args$)
    $tryStatements$;
} catch($exceptionType$$exceptionName$) {
    $catchStatements$;
} finally {
    $finallyStatements$;
}

以及最终结构:

try ($type$$objectName$= new $concreteType$($args$)) {
  $tryStatements$;
} catch($exceptionType$$exceptionName$) {
    $catchStatements$;
}

在变量设置中,您可以要求$concreteType $实现AutoCloseable接口.

但请注意,

>我在这里摆脱了finally块,并支持单个catch块.
>还假设每一个try-with-resources块将打开一个资源.
>如前所述,finally块中没有异常处理.

这个模板当然需要更多的工作,而且可能不值得这样做.

上一篇:idea,配置checkstyle 【提高代码质量,检查代码规范的工具 】Checkstyle,FindBugs,PMD,Jtest


下一篇:CheckStyle报错的常见问题及解决方式