2016-01-08 10 views
7

私は大きなものになっているアンドロイドプロジェクトをリファクタリングしています。 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() {} 
    } 
} 

に相当するだろうと思った私は、この場合には間違っているか、糸くずの問題ですか?

+0

[クラスがプライベートパッケージとして宣言されたときにパブリックコンストラクタを宣言する必要がありますか?](http://stackoverflow.com/questions/243218/should-we-declare-a-public-constructor-when-パッケージとして宣言されたクラス) –

+0

プライベートクラスを宣言すると、そのクラスに属するものはすべてプライベート – awsome

+0

@ cricket_007悲しいことになります。リントが不平を言っている部分はカバーしていません。 – tynn

答えて

2

Section 8.8.9 of the Java language specification, "Default constructor"は言う:クラス型で

、クラスがパブリック宣言されている場合、デフォルト コンストラクタが暗黙にアクセス修飾子を公開(6.6)を与えています。 クラスがprotectedと宣言されている場合、デフォルトコンストラクタは であり、暗黙的にaccess修飾子protected(§6.6)が与えられます。クラスが がプライベートであると宣言されている場合、デフォルトのコンストラクタに暗黙的に アクセス修飾子private(§6.6)が与えられます。それ以外の場合は、デフォルトのコンストラクタにはno access修飾子が暗黙的に指定するデフォルトのアクセス があります。

1

あなたは間違っていますが、リンターは特に明確ではなく、おそらくAndroid(J2MEではない)には関係しません。

Davidが説明したように、内部クラスの暗黙のデフォルトコンストラクタはクラス自体と同じアクセス修飾子を持ちますが、プライベートメンバーは同じコンパイルユニット(Javaファイル)内でアクセスできます。民間のコンストラクタを避ける言語上の理由はありません。

しかし、内部的には、クラスが個別の出力ファイルにコンパイルされるため、コンパイラは、クラスにprivateメンバーへのアクセスを提供する合成アダプタメソッドを作成する必要があります。これらのメソッドの実行時の短所は、デスクトップアプリケーションには関係ありませんが、J2MEのように窮屈なものであれば、(パッケージスコープを使用して)メンバーに直接アクセスできるようにすることで価値がなくなります。

Androidはクラスファイルに対して重要な後処理を実行し、AndroidデバイスはJ2MEデバイスほど制約がありません。両方のプラットフォームを対象とするコードを記述していない限り、lintの設定を変更します。

関連する問題