2010-02-19 39 views
6

我剛剛遇到一些令我感到困惑的代碼;我想澄清兩種變化。Java中傳遞的最終變量是否保留在另一端?

例1:

public String getFilepath(){ 
     final File file = new File(this.folder, this.filename); 
     return file.getAbsolutePath(); 
    } 

什麼是宣佈filefinal」 的目的是什麼?由於Java原語是通過值傳遞的,並且getAbsolutePath()剛剛返回String,所以在另一側(調用方法)該變量不會是final,是不是?而且由於file變量只存在於這兩行的範圍內,所以我無法真正看到final關鍵字的任何用途。有什麼我失蹤?任何人都看到了這樣做的理由?

例2:

public String getFilepath(){ 
     final File file = new File(this.folder, this.filename); 
     return file; 
    } 

由於這裏正在返回的實際對象......這是不是意味着file變量是不變/ final另一邊......?這似乎沒有道理。

一般來說,在我看來,你通過一個變量,沒有它的訪問類型。在中,我可以在函數中使用private變量,使用返回它的public get函數 - 但通過調用函數接收它的變量必須指定訪問修飾符。因此,如果它指定了public,那麼返回的變量將在該範圍內爲public。如果它指定private,則返回的變量將在該範圍內爲private。與final有什麼不同?是一個可以傳遞的變量的「恆定性」嗎?考慮到我對Java的瞭解,這讓我覺得不太可能。

或者我完全錯過了這一點,在上面的代碼中有final關鍵字的其他目的?

編輯:

我籤回來誰寫的代碼,原來的開發商,他說他只是把final關鍵字,因爲他原本以爲的方法將是一個很長時間,並希望確保該文件始終保持不變。他還表示,他通常會聲明一些不應該被改爲final的變量,作爲一個普遍的原則,並且遵循原則 - 這兩點都提到了下面的答案。所以看起來我讀了太多關於標準原因的簡單的額外關鍵字。感謝大家!

回答

3

有些人可能會告訴你,使用final會帶來性能上的好處,但這決不是最終證明的。

final關鍵字的主要優點是程序員可以指示不應更改類,方法或字段。

請記住,聲明變量final不會使被引用的對象不可變。這只是意味着變量不能重新賦值。您仍然可以運行變量file的方法,這些方法可能會在內部更改File對象。

在你給出的兩種方法中,我發現在使file變量final沒有價值。除非需要修改,否則一些代碼約定主張使所有變量均爲final。有些人不贊同這一點。我認爲它是precautionary principle的變體。

+0

有些情況下,使用最終肯定會給你更好的表現,例如使用http://en.wikipedia.org/wiki/Memoization。 – Stuart 2010-02-19 15:21:53

+0

@Stuart,你很困惑。 Memoization優化與'final'關鍵字無關(儘管它們可以在Java中結合使用,'final'關鍵字不提供任何Memoization模式的固有速度優勢)。 – BrainSlugs83 2014-10-05 05:11:01

+0

OP的問題從未得到解答。一個p̶a̶s̶s̶e̶d̶返回Java最終變量保持最終的另一端? – 2017-05-19 21:20:56

13

final在這種情況下僅僅意味着本地參考file將是不可變的。在方法之外沒有意義。有些編碼慣例主張所有變量都是最終的,除非它們需要可變,所以當有人遵循這些準則時,你會看到類似的代碼。

+3

我知道這是挑剔的......但我只是想提到「不可變的」可能不是最好的單詞選擇,因爲所有的字符串在Java中都是不可變的。不過,我明白你的觀點,不管 – froadie 2010-02-19 15:15:41

+5

我說_reference_文件是不可變的。即你不能將'文件'指向另一個'文件'對象。這正是'final'關鍵字在Java中的含義。該參考不能更改。單詞不可變只是意味着不能改變的東西。它可以在很多情況下使用。 – Kris 2010-02-19 15:40:19