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.
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. –
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!" *: -)) –