3

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变量吗?

4

5 回答 5

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);
}
于 2013-04-21T17:30:16.323 回答
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();
...
于 2013-04-21T17:32:03.473 回答
1

是的。编写一个辅助方法:

private Foo getFooOrNull() {
   try {
     return getFromSomewhere();
   } catch (Exception e) { return null;}
}

然后在你的课上:

private final Foo myFoo = getFooOrNull();

这将使 try/catch 块移开并提高代码可读性,此外还允许 yuo 让您保持最终状态。

于 2013-04-21T17:29:50.463 回答
1

如果它以某种方式改进您的代码,那么这种做法是好的。不加思索地为所有变量添加 final 肯定不是一个好习惯。顺便说一句,局部变量已经在方法中限定了范围,并且大多数时候寿命很短。为什么要让它们成为最终的?这又是一种微优化吗?老实说,您对此一无所获。而且您使代码的可读性降低。

final 表示您的变量是常量,这里不是这种情况,因为您重新分配了变量。
对我来说,这里的好答案是:不要使这个变量最终!

于 2013-04-21T17:40:18.333 回答
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();
}
于 2013-04-21T17:30:34.130 回答