簡體   English   中英

私有內部類的構造函數也是私有的嗎?

[英]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() {}
    }
}

在這種情況下我錯了還是皮棉問題?

Java語言規范的第8.8.9節“默認構造函數”說:

在類類型中,如果類被聲明為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM