Почему системный класс объявлен как final и с частным конструктором?

В соответствии с моим пониманием

Финальный класс

Последний класс - это просто класс, который не может быть расширен.

Класс с одним закрытым конструктором без аргументов

Невозможно создать экземпляр класса с частными конструкторами, кроме как внутри того же класса. Это делает бесполезным расширение его из другого класса. Но это не означает, что он вообще не может быть подклассом, среди внутренних классов мы можем расширять и вызывать частный конструктор.

Насколько я понимаю, если мы создадим класс с одним закрытым конструктором без аргументов, не имеет смысла объявлять этот класс окончательным. Тогда почему системный класс в Java объявлен как конечный класс, хотя у него нет единственного частного конструктора без аргументов?

Я слышал, что завершение курса дает некоторый прирост производительности. Это правильно, и это единственная причина объявить класс System окончательным? Пожалуйста, поясните, почему в Java реализован такой класс System.


person Bacteria    schedule 15.05.2015    source источник
comment
Он окончательный, поэтому не может быть расширен, и у него есть частный конструктор, поэтому он не может быть создан (потому что должен быть только один System) - они на самом деле не связаны.   -  person Evan Knowles    schedule 15.05.2015
comment
частный конструктор используется для создания одноэлементного класса, и если вы его расширите, вы можете создать объект суперкласса, чтобы ограничить этот системный объект   -  person nilesh virkar    schedule 15.05.2015
comment
Я думаю, это просто для того, чтобы всем было понятно: даже не пытайтесь его расширять. Я думаю, что в данном конкретном случае маловероятно, что будет какой-либо прирост производительности, поскольку System не имеет виртуальных методов, а только статические.   -  person Tagir Valeev    schedule 15.05.2015
comment
Вы искали первым? Это и this на SO; this и это снаружи.   -  person user1803551    schedule 15.05.2015


Ответы (1)


Иногда вам нужны некоторые «служебные» классы, которые содержат некоторые статические служебные методы. Расширение этих классов не ожидается. Таким образом, разработчики могут принять некоторые защитные решения и пометить такие классы «окончательными». Я бы сказал, что отметка класса Java как «final» может привести к небольшому увеличению производительности в Hotspot (см. https://wikis.oracle.com/display/HotSpotInternals/VirtualCalls). Но я почти уверен, что это было дизайнерское решение, а не производительность.

Вы можете использовать final классы, если вы хотите иметь некоторые неизменяемые объекты значений, или если вы хотите, чтобы классы создавались только с помощью их фабричных методов. Объекты неизменяемых значений особенно полезны при работе с параллелизмом:

public final class MyValueObject {
   private final int value;
   private MyValueObject(int value) { this.value = value; }
   public static MyValueObject of(int value) { return new MyValueObject(value); }  
}

Используя статический фабричный метод, вы можете скрыть все эти детали конструкции за фабричным методом. Более того, с помощью этой фабрики вы можете контролировать количество экземпляров этого класса во время выполнения - как в синглтонах.

Как я уже сказал, все это дизайнерские решения. Я почти уверен, что финальные классы не принесут заметного прироста производительности.

person Erhan Bagdemir    schedule 15.05.2015