2016-01-08 21 views
7

Jestem refactoring android projektu, który jest coraz duży. Uruchomione strzępki dają mi dostęp do prywatnego członka pomiędzy zewnętrznymi i wewnętrznymi klasami JSME. Biorąc pod uwagę następujący przykładCzy konstruktor prywatnej klasy wewnętrznej jest również prywatny?

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

    private class Inner {} 
} 

mogę uzyskać informacje

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 

stosujących rozwiązanie problemu zmienia źródło na

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

    private class Inner { 
     Inner() {} 
    } 
} 

jestem trochę zdezorientowany w tym momencie. Do tej pory myślałem, że przykład będzie równoznaczny z

Czy jestem w tym przypadku błędny, czy jest to kwestia kłaczków?

+0

Możliwy duplikat [Czy powinniśmy zadeklarować publicznego konstruktora, gdy klasa jest zadeklarowana jako pakiet prywatny?] (Http://stackoverflow.com/questions/243218/should-we-declare-a-public-constructor-when- klasa-jest-zadeklarowana jako pakiet-pri) –

+0

za każdym razem, gdy deklarujesz klasę jako prywatną, wszystko, co należy do tej klasy, staje się prywatne – awsome

+0

@ cricket_007 niestety nie. Nie dotyczy to części, której dotyczy skarga. – tynn

Odpowiedz

2

Section 8.8.9 of the Java language specification, "Default constructor" mówi:

W rodzaju klasy, jeśli klasa jest zadeklarowana publicznego, wówczas konstruktor domyślny jest niejawnie podana opinii publicznej modyfikator dostępu (§6.6); jeśli klasa jest deklarowana jako chroniona, wówczas domyślnym konstruktorem jest niejawnie chroniony modyfikator dostępu (§6.6); jeśli klasa jest zadeklarowana jako prywatna, wówczas domyślnemu konstruktorowi przypisuje się niejawnie modyfikator dostępu prywatny (§6.6); w przeciwnym razie domyślny konstruktor ma domyślny dostęp domyślny bez żadnego modyfikatora dostępu.

1

Mylisz się w swoim rozumieniu, ale liniowiec nie jest szczególnie jasny, a rada prawdopodobnie nie jest istotna dla Androida (który nie jest J2ME).

Jak wyjaśnił David, domyślny domyślny konstruktor klasy wewnętrznej ma taki sam modyfikator dostępu co sama klasa, ale członkowie prywatni są dostępni w tej samej jednostce kompilacji (plik Java). Nie ma powodu, aby unikać prywatnego konstruktora.

Jednak wewnętrznie, ponieważ klasy są kompilowane w osobne pliki wyjściowe, kompilator musi utworzyć syntetyczne metody adapterów, aby zapewnić dostęp klas do prywatnych członków. Wadą tych metod jest niedopasowanie środowiska wykonawczego, ale w przypadku czegoś tak ciasnego jak J2ME różnica może być warta wyeliminowania poprzez bezpośrednie udostępnienie elementu (za pomocą pakietu).

Android wykonuje znaczące przetwarzanie końcowe plików klasowych, a urządzenia z Androidem nie są tak samo ograniczone, jak urządzenia J2ME. Jeśli nie piszesz kodu, by kierować obie platformy, zmieniłbym konfigurację kłaczków.