局部变量的初始化

时间:2013-10-11 17:54:42

标签: java

声明未初始化的final变量和将final变量设置为null之间的区别是什么?

void A(String pizza) {
    String retVal = null;

    if (StringUtils.isBlank(pizza)) {
       retVal = "blank"
    } else {
       retVal = computeString(pizza);
    }
}

void A(String pizza) {
    final String retVal;

    if(StringUtils.isBlank(pizza)) {
       retVal = "blank"
    } else {
       retVal = computeString(pizza);
    }
}

5 个答案:

答案 0 :(得分:2)

也许我不理解,但是在您的第二个示例中,您将无法在retVal阻止后重新分配if-elseA final variable

  

只能分配一次。声明变量final可以作为   有用的文档,它的价值不会改变,可以帮助避免   编程错误。

如果您已将final变量设置为null,则无法在if块中重新分配。

答案 1 :(得分:1)

如果您将最终变量设置为null,您将永远无法为其分配任何其他内容...... 最终变量(本身)永远不会改变。

答案 2 :(得分:1)

不同之处在于,永远不能将最终变量更改为具有其他值。

答案 3 :(得分:0)

在这一个中,retVal = null什么也没做。你给它一个null值。您永远不会拥有使用该值的代码。然后你给它另一个值,这取决于你是使用if-then还是else部分。

在我添加评论的代码中,您可以使用或更改retVal的值。

  void A(String pizza) {
      String retVal = null;
      ... code in here could use it or give it a new value ...
      if(StringUtils.isBlank(pizza) {
         retVal = "blank"
      } else {
         retVal = computeString(pizza);
      }
      ... additional code here might change it (and can use it's value) ...
   }

在这个中,每次调用方法时都需要给retVal一个值。你的if-then-else代码可以做到这一点。在给定值之后,永远不能更改该值。

一个区别是编译器会在给它一个值之前告诉你是否使用了retVal。合理地说,它会告诉你变量还没有值。

   void A(String pizza) {
      final String retVal;
      ... code in here cannot use it or give it a value, too ...
      if(StringUtils.isBlank(pizza) {
         retVal = "blank"
      } else {
         retVal = computeString(pizza);
      }
      ... additional code here cannot change it but can use it's value ...
   }

答案 4 :(得分:0)

final表示:

  • 必须分配(即使它为空)
  • 您之后无法将引用更改为其他任何内容(但您当然可以修改) 引用的对象)。

含义高度语义,并确保您不会意外忘记关注要分配的内容,并且您可以保证不会意外更改该值。
省略此修饰符只是删除了该保证,没有别的。