2013-10-11 201 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手段:

  • 必須分配的東西(即使是空)
  • 不能參考改變心意之後(但你可以,當然,修改 引用的對象)。

的含義是非常語義,並確保你不會不小心忘記關心的分配,並且可以與保證值不小心改變的代碼。
忽略此修飾符只是刪除該保證,沒有別的。