2012-04-12 63 views
1

由於我可以直接訪問內部類的private變量,並且訪問inner類的唯一方法是通過outer類。對於內部類有公共訪問器/增變器方法是否有任何價值?如果只從外部類訪問,是否需要內部類的公共訪問器?

public class Outer { 
    Inner i; 

    Outer() { 
     i.v = 5; 
    } 

    private class Inner { 
     private int v; 
    } 
} 

對於這個問題的目的,假設沒有延遲實例或其他的數據操作時訪問需要。

回答

5

好吧,使字段非私有將避免創建訪問這些私有成員的合成方法。在你的榜樣,編譯Outer$Inner類包含這樣的合成方法:

static int access$002(Outer$Inner, int); 
    Code: 
     0: aload_0 
     1: iload_1 
     2: dup_x1 
     3: putfield  #1     // Field v:I 
     6: ireturn 

也許會被內聯到沒什麼,也許不會......但除非有任何原因迫使它的存在,爲什麼不只是給v默認訪問?

至於使用存取方法而不是直接使用字段......這更多的是品味問題。你不能阻止外部類可以直接訪問字段,所以它是一個一點點就像詢問你是否應該爲一個類中的私有字段創建訪問器一樣。

正如在另一個答案中提到的那樣,使用訪問器使其更易於重構。是嵌套類只是一個實現細節,其中從來沒有需要移動?如果是這樣,也許這很好。我發現如果我有一個類似於的類只是封裝字段沒有其他行爲,我將這些字段公開(在私人類中,不要忘記)宣傳「嘿,我沒有檢查這裏有什麼......「

+0

真的嗎?我認爲編譯器總是會創建內部類的綜合方法。 – emory 2012-04-12 19:50:00

+0

重構友好是一個很好的觀點!謝謝 – JAM 2012-04-12 19:50:27

+0

@emory:如果不需要任何合成材料就可以訪問。至少,不是我正在運行的javac版本:) – 2012-04-12 19:50:54

1

如果稍後您可能會通過函數調用或其他方式暴露您的Inner對象,那麼是的,這很重要。對於同步目的而言,這可能也很重要,具體取決於內部類中發生了什麼