Java-Final class vs private constructor: Разница между java.util.Arrays и java.lang.Math

Я знаю разницу между конечным классом (вы не можете наследовать класс) и частным конструктором (вы не можете создать экземпляр класса). Но почему Arrays и Math, классы Java, имеют как частные конструкторы, а Math - последний класс, а Arrays - нет?

В чем разница? Не являются ли классы утилиты?

Спасибо

Ответ 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 не определяется как неконфиденциальный из-за вышеизложенного - это, вероятно, просто надзор над разработчиком, который не имеет значения для всех, которые соответствуют, поэтому он не был установлен на сегодняшний день.