2017-01-27 19 views
10

Znam różnicę między ostatnią klasą (nie można dziedziczyć klasy) i prywatnym konstruktorem (nie można utwórz instancję klasy). Ale dlaczego Arrays i , klasy Java, mają zarówno prywatnych konstruktorów, ale Math jest ostateczna klasa i Arrays nie jest?Klasa Java-Final vs prywatny konstruktor: Różnica między java.util.Arrays i java.lang.Math

Jaka jest różnica? Czy nie są to obie klasy użytkowe?

Dzięki

+1

Wygląda na to, że autorzy 'Tablic' po prostu zapomnieli o' ostatecznej 'klasie. Jego konstruktor jest nadal "prywatny" (i komentowany przez domyślny konstruktor _Suppresses, zapewniający nie-natychmiastowość._) i żadne instancje 'Tablic' nie są tworzone (bez refleksji, pewnie), podczas gdy reszta" publicznych "jest" statyczna ", stąd też jest to klasa "narzędziowa". Semantycznie "Math" i "Array" są zarówno "użyteczności". W porównaniu do języka C#, w Javie brakuje "statycznych" klas i prawdopodobnie byłoby miło, gdyby Java miała na początku taki rodzaj zajęć, nie wymagając "finalizacji" klasy i wstawienia "prywatnego" konstruktora. –

+0

Dobre pytanie. Przypuszczam tylko, że o tym zapomnieli. ('java.util.Objects' jest również oznaczane' final', a konstruktor 'private', a prywatny konstruktor zgłasza' AssertionError' z komunikatem * "No java.util.Objects dla ciebie!" *: -)) –

Odpowiedz

5

Gdy klasa ma prywatnego konstruktora, ale nie jest ostateczna, można zdefiniować klas wewnętrzne w tym samym pliku klasy, które mają konstruktorów publicznych i może być instancja. Ale nie można zdefiniować żadnych podklas poza tym początkowym plikiem klasy. Przykładowo będzie to skompilować:

public class Animal { 
    public void say() { 
    System.out.printLn("Animal says:"); 
    } 
    private Animal() {} 

    public static class Cat extends Animal { 
    public Cat() {super();} 
    @Override public void say() { 
     super.say(); 
     System.out.printLn("Meow"); 
    } 
    } 
} 

Jednak ta (zdefiniowana w innym pliku) nie będzie:

public class Dog extends Animal { 
    public Dog() {super();} // compilation error here: The constructor Animal() is not visible 
    @Override public void say() { 
    super.say(); 
    System.out.printLn("Wuf"); 
    } 
} 

Technika ta pozwala na zdefiniowanie hierarchii klas, gdzie masz pełną kontrolę nad tym, co typy mogą rozszerz swoją klasę (ponieważ wszystkie te podtypy muszą być wyliczone w tym samym pliku klasy).

To powiedziawszy, java.util.Arrays nie jest zdefiniowany jako nieostateczny z powodu powyższego - prawdopodobnie jest to tylko nadzór realizatora, który nie ma znaczenia dla wszystkich pasujących elementów, więc nie został na razie ustalony.

Powiązane problemy