[英]Is constructor of private inner class also private?
我正在重構一個正在變大的android項目。 運行lint為我提供了JSME問題 外部和內部類之間的私有成員訪問 。 考慮以下示例
public class Outer {
private Inner mInner = new Inner();
private class Inner {}
}
我得到了這些信息
Name
private field Inner mInner
Location
class Outer (default package)
Problem synopsis
Access to private member of class 'Inner' at line 2
Problem resolution
Make 'Inner' constructor package-local
應用問題解決方案會將源更改為
public class Outer {
private Inner mInner = new Inner();
private class Inner {
Inner() {}
}
}
我此刻有點困惑。 到現在為止,我認為這個例子相當於
public class Outer {
private Inner mInner = new Inner();
private class Inner {
public Inner() {}
}
}
在這種情況下我錯了還是皮棉問題?
在類類型中,如果類被聲明為public,則默認構造函數被隱式賦予訪問修飾符public(§6.6); 如果該類被聲明為protected,則默認構造函數被隱式賦予訪問修飾符protected(§6.6); 如果該類被聲明為private,則默認構造函數被隱式賦予訪問修飾符private(§6.6); 否則,默認構造函數具有無訪問修飾符隱含的默認訪問權限。
你的理解是錯的,但是linter並不是特別清楚,而且建議可能與Android(不是J2ME)無關。
正如David解釋的那樣,內部類的隱式默認構造函數具有與類本身相同的訪問修飾符,但私有成員可在同一編譯單元(Java文件)中訪問。 沒有語言理由可以避免使用私有構造函數。
但是,在內部,由於類被編譯為單獨的輸出文件,因此編譯器必須創建合成適配器方法以提供對私有成員的類訪問。 這些方法的運行時缺點與桌面應用程序無關,但對於像J2ME這樣狹窄的東西,可以通過直接訪問成員(使用包范圍)來消除差異。
Android對類文件執行重要的后處理,而Android設備幾乎不像J2ME設備那樣受限制。 除非您編寫代碼來定位兩個平台,否則我會更改lint配置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.