0

声明未初始化的最终变量和将最终变量设置为 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);
    }
}
4

5 回答 5

2

也许我不明白,但在你的第二个例子中,你将无法retVal在你的if-else块之后重新分配。一个final变量

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

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

于 2013-10-11T17:56:47.723 回答
1

不同之处在于最终变量永远不能更改为具有另一个值。

于 2013-10-11T17:59:23.033 回答
1

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

于 2013-10-11T17:57:50.917 回答
0

在这一点上,retVal = 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 ...
   }
于 2013-10-11T18:05:29.167 回答
0

final方法:

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

含义是高度语义化的,并确保您不会不小心忘记要分配的内容,并且您可以在保证值不会意外更改的情况下进行编码。
省略此修饰符只会删除该保证,仅此而已。

于 2013-10-11T18:14:01.503 回答