2016-01-08 18 views
7

Sto rifattorizzando un progetto Android che sta diventando grande. Lint in esecuzione mi dà il numero JSMEAccesso membro privato tra classi esterne e interne. Considerando l'esempio seguenteIl costruttore della classe interna privata è anche privato?

public class Outer { 
    private Inner mInner = new Inner(); 

    private class Inner {} 
} 

ottengo le informazioni

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 

Applicando la risoluzione del problema cambia la sorgente di

public class Outer { 
    private Inner mInner = new Inner(); 

    private class Inner { 
     Inner() {} 
    } 
} 

Sono un po 'confuso in questo momento. Fino ad ora ho pensato che l'esempio sarebbe equivalente a

public class Outer { 
    private Inner mInner = new Inner(); 

    private class Inner { 
     public Inner() {} 
    } 
} 

Mi sbaglio in questo caso o è un problema di garza?

+0

Possibile duplicato di [Dovremmo dichiarare un costruttore pubblico quando la classe è dichiarata come pacchetto privato?] (Http://stackoverflow.com/questions/243218/should-we-declare-a-public-constructor-when- la classe-è-dichiarata-come-pacchetto-pri) –

+0

ogni volta che dichiari una classe privata, tutto ciò che appartiene a quella classe diventa privato – awsome

+0

@ cricket_007 purtroppo no. Non copre la parte che la lint si lamenta. – tynn

risposta

2

Section 8.8.9 of the Java language specification, "Default constructor" dice:

In un tipo di classe, se la classe è dichiarata pubblica, quindi il costruttore di default è implicitamente dato l'accesso modificatore di pubblico (§6.6); se la classe viene dichiarata protetta, il costruttore predefinito è dato implicitamente protetto dal modificatore di accesso (§6.6); se la classe è dichiarata privata , il costruttore di default viene implicitamente assegnato al modificatore di accesso privato (§6.6); in caso contrario, il costruttore predefinito ha l'accesso predefinito implicito da nessun modificatore di accesso.

1

Hai torto nella tua comprensione, ma il linter non è particolarmente chiaro, e il consiglio probabilmente non è rilevante per Android (che non è J2ME).

Come spiegato da David, il costruttore implicito predefinito della classe interna ha lo stesso modificatore di accesso della classe stessa, ma i membri privati ​​sono accessibili all'interno della stessa unità di compilazione (file Java). Non c'è motivo di linguaggio per evitare il costruttore privato.

Tuttavia, internamente, poiché le classi sono compilate in file di output separati, il compilatore deve creare metodi sintetici dell'adattatore per fornire alle classi l'accesso ai membri privati. Lo svantaggio di runtime di questi metodi è irrilevante per le applicazioni desktop, ma per qualcosa di angusto come J2ME, la differenza potrebbe valere la pena di essere eliminata rendendo il membro accessibile direttamente (usando l'ambito del pacchetto).

Android esegue una post-elaborazione significativa sui file di classe e i dispositivi Android non sono così limitati come i dispositivi J2ME. A meno che tu non stia scrivendo il codice per scegliere come target entrambe le piattaforme, cambierei la configurazione del filtro.

Problemi correlati