2017-07-18 220 views
2

由於封閉類可以訪問其內部類的私有字段,何時應該將私有內部類聲明爲private,default或public?Java - 私有成員vs私有內部類的默認成員

+0

內部類也可以通過不封閉它的其他類使用。 – Henry

+1

也許:https://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members?rq=1 – 2017-07-18 04:59:32

+1

內部類是公共還是私人? – ajb

回答

0

除非有理由使用包私有或公開可見性,否則將所有內容聲明爲私有是一種很好的風格。而這個原因不應該是這樣更方便

所有不是私人的可能會在您的課程外部使用,因此更改爲您的代碼的任何非私人方面可能會破壞其他代碼位置或甚至依賴於您的代碼的外部代碼。讓重構變得更困難或有時甚至是不可能的,並改變你的類的內部工作。

私人內部類的特殊情況下,所有內容都只對您的包含類可見。這是內部班級成員的知名度並不重要。另一個極端,如果你正在研究一個圖書館的常見做法,只將接口公開爲契約。保持實施細節完全隱藏。

1

乍一看,在內部類的成員上指定訪問修飾符似乎並不重要。正如你所指出的那樣,包含類可以訪問所有成員。

這裏有一些額外的考慮,但:

  • 有時內部類被聲明public並作爲包含類的接口定義的一部分。也許外部類有一個返回內部類的實例的方法。在這種情況下,內部類與成員頂級類的成員可見性一樣受最佳實踐的約束。在這種情況下,最好保留實施細節private
  • 雖然它不會被編譯器強制執行,但將內部類的成員標記爲private可以爲將來的維護者記錄這些成員不打算由外部類代碼直接訪問。當然,在這一點上,它可能需要將內部類重構爲它自己的頂級類。
  • 有時,內部類與基於反射的框架結合使用,這些框架僅對public成員進行操作。例如,Jackson JSON序列化程序默認僅在public成員上運行。通過添加一個public吸氣劑,可以使其在private成員上運行。這是額外的工作,所以首先宣佈成員public可能會更方便。
  • 如果以上幾點不適用,並且沒有任何其他要求,最簡單和最短的代碼是完全省略訪問修飾符(默認/包私有)。這將是一個項目需要考慮的編碼風格問題。
0

不僅外部類而且其他類可以訪問內部類和它的成員。所以當你想讓內部類成員只能通過外部類訪問時,你可以聲明它們是私有的。考慮休耕例如

有2班在同一個包com.exercise.test和類在它被OtherClassSampleClassWithInner包含內部類的聲明爲private InnerClassInnerClass

成員不在OtherClass訪問。其中,因爲它是在訪問SampleClassWithInner

是指爲了更清楚,這個代碼

package com.exercise.test; 
//import com.exercise.test.SampleClassWithInner.InnerClass; 

public class OtherClass { 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    SampleClassWithInner sampleobj = new SampleClassWithInner(); 
    SampleClassWithInner.InnerClass innerobj = sampleobj.new InnerClass(); 

    // innerobj.var1=5; //compile time error 
    innerobj.setVar1(5); // ok works 
    // System.out.println("value of inner variable declared in other 
    // class"+innerobj.var1);// compile time error 
    System.out.println("value of inner variable declared in other class " 

+ innerobj.getVar1()); 
     sampleobj.innerMethodDemo(); 
    } 

} 

package com.exercise.test; 

public class SampleClassWithInner { 

class InnerClass { 
    private int var1; 
    private int var2; 

    public int getVar1() { 
     return var1; 
    } 

    public void setVar1(int var1) { 
     this.var1 = var1; 
    } 

    public int getVar2() { 
     return var2; 
    } 

    public void setVar2(int var2) { 
     this.var2 = var2; 
    } 
} 

public void innerMethodDemo() { 
    InnerClass obj = new InnerClass(); 
    obj.var1 = 10; 
    System.out.println("this is form the method in outer class " + 

obj.var1); 

    } 
}