2013-10-11 63 views
0

声明未初始化的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); 
    } 
} 
+1

你的意思是在第一个A上有一个'final'吗? –

回答

2

也许我不明白,但在你的第二个例子,你将无法您的if-else块之后重新分配retValA final variable

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

如果您曾将final变量null,你将无法重新分配它在if块。

1

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

1

区别在于最终变量永远不能被更改为具有其他值。

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 ... 
    } 
0

final手段:

  • 必须分配的东西(即使是空)
  • 不能参考改变心意之后(但你可以,当然,修改 引用的对象)。

的含义是非常语义,并确保你不会不小心忘记关心的分配,并且可以与保证值不小心改变的代码。
忽略此修饰符只是删除该保证,没有别的。