由於封閉類可以訪問其內部類的私有字段,何時應該將私有內部類聲明爲private,default或public?Java - 私有成員vs私有內部類的默認成員
2
A
回答
0
除非有理由使用包私有或公開可見性,否則將所有內容聲明爲私有是一種很好的風格。而這個原因不應該是這樣更方便。
所有不是私人的可能會在您的課程外部使用,因此更改爲您的代碼的任何非私人方面可能會破壞其他代碼位置或甚至依賴於您的代碼的外部代碼。讓重構變得更困難或有時甚至是不可能的,並改變你的類的內部工作。
在私人內部類的特殊情況下,所有內容都只對您的包含類可見。這是內部班級成員的知名度並不重要。另一個極端,如果你正在研究一個圖書館的常見做法,只將接口公開爲契約。保持實施細節完全隱藏。
1
乍一看,在內部類的成員上指定訪問修飾符似乎並不重要。正如你所指出的那樣,包含類可以訪問所有成員。
這裏有一些額外的考慮,但:
- 有時內部類被聲明
public
並作爲包含類的接口定義的一部分。也許外部類有一個返回內部類的實例的方法。在這種情況下,內部類與成員頂級類的成員可見性一樣受最佳實踐的約束。在這種情況下,最好保留實施細節private
。 - 雖然它不會被編譯器強制執行,但將內部類的成員標記爲
private
可以爲將來的維護者記錄這些成員不打算由外部類代碼直接訪問。當然,在這一點上,它可能需要將內部類重構爲它自己的頂級類。 - 有時,內部類與基於反射的框架結合使用,這些框架僅對
public
成員進行操作。例如,Jackson JSON序列化程序默認僅在public
成員上運行。通過添加一個public
吸氣劑,可以使其在private
成員上運行。這是額外的工作,所以首先宣佈成員public
可能會更方便。 - 如果以上幾點不適用,並且沒有任何其他要求,最簡單和最短的代碼是完全省略訪問修飾符(默認/包私有)。這將是一個項目需要考慮的編碼風格問題。
0
不僅外部類而且其他類可以訪問內部類和它的成員。所以當你想讓內部類成員只能通過外部類訪問時,你可以聲明它們是私有的。考慮休耕例如
有2班在同一個包com.exercise.test
和類在它被OtherClass
和SampleClassWithInner
包含內部類的聲明爲private InnerClass
InnerClass
成員不在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);
}
}
相關問題
- 1. 私有成員
- 2. 靜態成員類 - 聲明類私有和類成員包私有?
- 3. 訪問私有成員的私有成員
- 4. 訪問類私有成員內的結構成員?
- 5. 在內部類中訪問外部類的私有成員:JRuby
- 6. 類的聲明沒有私有成員
- 7. 實例初始化VS私有成員
- 8. 更改私有類成員的類
- 9. Java:獲取私有成員的註釋
- 10. 繼承和私有成員
- 11. 訪問私有成員C++
- 12. 訪問私有成員
- 13. C++私有函數成員
- 14. 對象類型私有類成員
- 15. 從其他類訪問私有成員
- 16. 包私有靜態成員類與包私有類
- 17. 閱讀私有變量的類成員
- 18. 訪問私有類中的成員
- 19. 數組作爲類的私有成員
- 20. 訪問類內部的私有成員指針的假設
- 21. Java中的私人成員
- 22. 公共類,但私有成員變量?
- 23. 子類化與私有成員
- 24. 朋友沒有得到私有成員
- 25. 使用類成員函數訪問類內的私有結構
- 26. 爲什麼要在Java中公開私有的內部類成員?
- 27. A類(即類B的成員)如何共享B類的私有成員?
- 28. 初始化結構的私有成員
- 29. fstream的訪問爲私有成員
- 30. 訪問cuda內核中的類的私有成員
內部類也可以通過不封閉它的其他類使用。 – Henry
也許:https://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members?rq=1 – 2017-07-18 04:59:32
內部類是公共還是私人? – ajb