【发布时间】:2012-02-19 15:45:28
【问题描述】:
我有一个变量在初始化后不应该改变它的值,所以我想将它定义为最终变量。
问题是变量必须在try块中初始化,所以我遇到了以下麻烦:
我有以下代码:
Connection conn = null;
try {
conn = getConn(prefix);
[...do some stuff with conn...]
} catch (Exception e) {
throw new DbHelperException("error opening connection", e);
} finally {
closeConnection(conn);
}
如果我将变量声明为 final,而不将其初始化为 null,我会在 finally 块上得到“局部变量 conn 可能尚未初始化”。另一方面,如果我将其声明为 final 并将其初始化为 null,则会在 try 块中收到错误“无法分配最终局部变量 conn”。
编辑:lxx 回答后,我使用了这个版本
try {
final Connection conn = conn = getConn(prefix);
try {
return selectAll(conn, sql, params);
} catch (Exception e) {
throw new DbHelperException("error executing query", e);
} finally {
closeConnection(conn);
}
} catch (Exception e) {
throw new DbHelperException("error opening connection", e);
}
所以这应该是这样做的方式吗?
--
经验教训:
我认为这个问题的正确答案是 lxx 给出的答案,但在这种情况下,我想声明变量 final 的弊端超过了它的好处......
--
编辑:发现关于何时使用 final 的堆栈溢出的两个问题
When should one use final for method parameters and local variables?
【问题讨论】:
-
将
final Connection finalConn = conn;附加到您的代码中怎么样? -
为什么你需要两个
trys?为什么不只使用一个 try-catch 来获取连接并使用它来全选? -
我会质疑为什么您认为将其宣布为最终结果如此重要。对我来说,这似乎相当保姆和唠叨。如果我是用户,并且我调用了您的方法来建立连接,那么我看不出有任何理由要通过更改它来搞砸它。如果我这样做了,我认为后果应该由用户承担。
-
同意达菲莫。对于如此短的代码块中的局部变量,final 是没有必要的。
-
yshavit:这两次尝试都是我发现的方式 - 感谢 lxx- 将变量保持为最终...