Ответ 1
Когда класс имеет частный конструктор, но не является окончательным, вы можете определить внутренние классы в том же файле класса, который имеет общедоступные конструкторы и может быть создан. Но вы не можете определить какие-либо подклассы вне этого исходного файла класса. Например, это скомпилировало бы:
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");
}
}
}
Однако это (определенное в другом файле) не будет:
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");
}
}
Этот метод позволяет вам определить иерархию классов, где у вас есть полный контроль над тем, какие типы могут расширить ваш класс (потому что все эти подтипы должны быть перечислены внутри одного и того же файла класса).
Тем не менее, java.util.Arrays
не определяется как неконфиденциальный из-за вышеизложенного - это, вероятно, просто надзор над разработчиком, который не имеет значения для всех, которые соответствуют, поэтому он не был установлен на сегодняшний день.