2012-08-10 17 views
11

Znalazłem tę konstrukcję w jakimś kodzie.Programowanie w języku Java: Prywatna klasa implementacji

Czy istnieje jakaś korzyść z posiadania prywatnego egzemplarza klasy statycznej A? Przypomniało mi to idiom Pimpl w C++. Czy jest jakaś korzyść z używania idiomu Pimpl w Javie?

public abstract class A { 
    public void doStuff(); 

    public static A getNewInstance() { 
     return new AImpl(); 
    } 

    private static class AImpl extends A { 
     public void doStuff() { 
      .... 
     }  
    } 

} 

Odpowiedz

17

Czy jest jakaś korzyść mieć prywatny klasa statyczna wdrożyć?

Cóż, całkowicie ukrywa implementację, więc z punktu widzenia enkapsulacji jest całkiem niezły. Jedna sytuacja, którą widziałem to już kilka razy, to niestandardowe komparatory. Na przykład:

public class Person 
{ 
    public static final Comparator<Person> NAME_COMPARATOR = new NameComparator(); 
    public static final Comparator<Person> AGE_COMPARATOR = new AgeComparator(); 

    // Name, age etc properties 

    private static class NameComparator implements Comparator<Person> 
    { 
     ... 
    } 

    private static class AgeComparator implements Comparator<Person> 
    { 
     ... 
    } 
} 

Nie ma rzeczywistej potrzeby realizacji zajęć komparator być widoczny na zewnątrz Person i miło jest być w stanie uzyskać instancję łatwo poprzez pola statycznego publicznego.

Żaden dzwoniący nie musi znać implementacji - może istnieć tylko jedna klasa kompilatora, która pobiera parametry, na przykład - po prostu określają, który komparator chce przez stałe. (Oczywiście można również użyć wyliczenia.)

+1

Dzięki za odpowiedź. Ale czy nie jest lepiej, aby 'NameComparator' i' AgeComparator' były klasami niepublicznymi? Nie jestem pewien, ale czy dodanie statycznej klasy wewnętrznej nie powoduje niezgodności binarnej? – Chip

+0

@Chip: jeśli są to zajęcia niepubliczne poza "Person", nadal są dostępne w tym samym pakiecie, gdy naprawdę nie muszą być. Dodanie statycznej wewnętrznej klasy * może * zmienić numer seryjny UID, chyba że wyraźnie go określisz, ale serializacja binarna w Javie jest tak okropna, że ​​i tak jej nie używam. Nie wierzę, że wpłynie to na kompatybilność binarną po prostu uruchomieniu kodu. –

+0

Dzięki Jon. Ma sens, jeśli nie łamie kompatybilności binarnej. Aby projekt był elastyczny, chciałbym móc dodać kolejną klasę, na przykład "AImpl2" w ten sam sposób, a nie łamać starszych klientów. – Chip