Является ли системный класс синглтоном, абстрактным или что?

Такой класс, как LocalDate, является неизменяемым, у него есть частный конструктор, и каждый раз, когда нам нужен его объект, мы должны вызывать его статические методы, например LocalDate.now() или LocalDate.of(year, month, day). Эти методы используют ключевое слово new и вызывают этот частный конструктор, поэтому каждый раз создается «новая ссылка». Это не одноэлементный класс, потому что мы можем иметь несколько объектов одновременно.

А как же System класс? Он похож на LocalDate, у него есть приватный конструктор, но нет статического метода для его вызова. Этот класс также не является абстрактным, так почему же программисты Java написали класс System, как будто никто не может сделать из него объект? Какой шаблон проектирования стоит за этим? Какие классы действуют так?


person Mohammad Kholghi    schedule 13.05.2020    source источник
comment
Зачем вам создавать экземпляр System? В любом случае, если вам нужно определение, вы можете назвать его служебным классом. Не более чем набор связанных методов.   -  person Federico klez Culloca    schedule 13.05.2020
comment
System предназначено быть статическим пространством имен для размещения некоторых статических методов и полей, связанных с системой, но поскольку java может иметь методы только в классе, это класс только с частным конструктором, который никто не может использовать. . Он не предназначен для создания экземпляра, но он также не предназначен для наследования, а не абстрактного. Чтобы лучше смоделировать намерение такой конструкции, язык C# может объявлять статические классы, у которых нет конструктора, но в java такой вещи нет.   -  person Ackdari    schedule 13.05.2020
comment
@FedericoklezCulloca Я не хочу его создавать. Я хочу знать, почему это не может быть создано? И спасибо, я искал его имя: служебный класс   -  person Mohammad Kholghi    schedule 13.05.2020
comment
@MohammadKholghi Я не имел в виду тебя конкретно. Я имел в виду, почему он должен быть создан в первую очередь? В этом нет необходимости.   -  person Federico klez Culloca    schedule 13.05.2020
comment
@FedericoklezCulloca Ага. Я изучаю java, и никогда не обращал на это внимания. Сегодня я обнаружил, что это может произойти, и хотел знать, почему:) А как насчет System.out.println()? Я имею в виду, что если бы у меня был объект класса System, мне не нужно было бы каждый раз вызывать весь класс для обычной печати.   -  person Mohammad Kholghi    schedule 13.05.2020
comment
@MohammadKholghi println - это метод не System, а PrintStream, экземпляром которого является System.out. Итак, есть что-то, что было воплощено. Вам просто не нужно делать это явно :)   -  person Federico klez Culloca    schedule 13.05.2020
comment
Связано: классы Singleton   -  person Ole V.V.    schedule 14.05.2020


Ответы (1)


У него есть частный конструктор, который никогда не вызывается, поэтому никогда не бывает экземпляров (для синглтона он потребуется).

/** Don't let anyone instantiate this class */
private System() {
}

это не абстрактно

public final class System {

System используется больше как пространство имен. Это просто контейнер для кучи статических методов и констант.

Java не позволяет вам размещать методы вне класса, поэтому иногда результатом является совершенно неконкретный «класс», подобный этому.

person Michael    schedule 13.05.2020