Java - 不可变局部变量

时间:2013-04-21 17:23:35

标签: java exception exception-handling coding-style immutability

默认情况下,创建局部变量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变量?

5 个答案:

答案 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();
}