默认情况下,创建局部变量final
是很常见的“好习惯”。不知道eclipse,但在IDEA中,“创建局部变量”对话框中甚至还有一个复选框。但有一个问题不允许我每次都使用它。以此代码为例:
...
final Foo foo = null;
try{
foo = getFromSomewhere();
} catch (IDontCareException e) {
log.info(e, "looks like foo is not there);
}
if (foo != null) {
doSomethingWithFoo(foo);
}
doSomethingElse();
...
问题是IDontCareException
没有延伸RuntimeException
...有没有办法使用final
变量?
答案 0 :(得分:2)
试
final Foo foo;
try{
foo = getFromSomewhere();
} catch (IDontCareException e) {
log.info(e, "looks like foo is not there);
foo = null;
}
if (foo != null) {
doSomethingWithFoo(foo);
}
编辑:它不编译。试试这个
Foo tmp;
try{
tmp = getFromSomewhere();
} catch (IDontCareException e) {
log.info(e, "looks like foo is not there);
tmp = null;
}
final Foo foo = tmp;
if (foo != null) {
doSomethingWithFoo(foo);
}
答案 1 :(得分:2)
final的定义是你不能改变它引用的内容。使用foo = getFromSomewhere()
,您可以做到这一点。你不能这样做。一种选择是将它全部放在try-block中,如下:
try{
final Foo foo = getFromSomewhere();
doSomethingWithFoo(foo); //If getFromSomewhere() always returns a non-null value, otherwise you will still need the null-check
} catch (IDontCareException e) {
log.info(e, "looks like foo is not there);
}
doSomethingElse();
...
答案 2 :(得分:1)
是肯定的。写一个帮助方法:
private Foo getFooOrNull() {
try {
return getFromSomewhere();
} catch (Exception e) { return null;}
}
然后在你的课堂上:
private final Foo myFoo = getFooOrNull();
这将使try / catch块移开并提高代码可读性,此外还允许yuo让你保持最终的最终状态。
答案 3 :(得分:1)
如果以某种方式改进您的代码,那么练习就很好。在不考虑的情况下将final添加到所有变量当然不是一个好习惯。
顺便说一下,局部变量已经在方法范围内,并且大部分时间的寿命很短。为什么让他们最终?它又是一种微观优化吗?老实说,你没有得到任何东西。而且你的代码可读性更低。
final表示你的变量是常量,因为你重新分配你的变量就不是这里的情况了 对我来说,这里的好答案是:不要让这个变量最终!
答案 4 :(得分:0)
你可以尝试例如:
private void myMethod(){
try{
final Foo foo = getFromSomewhere();
if(foo != null){
doSomethingWithFoo(foo);
}
} catch (IDontCareException e) {
log.info(e, "looks like foo is not there);
}
doSomethingElse();
}