我现在在一家公司工作,直到大约一年前才使用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块中没有异常处理.
这个模板当然需要更多的工作,而且可能不值得这样做.