Объекты в Джаве
Когда-то давно я знал Джаву плохо, у меня была проблема. Я открывал Джавадок и понимал в целом, как пользоваться объектом, но не понимал, как создать его. Сегодня я знаю Джаву лучше, но проблема никуда не ушла.
Дело вот в чем: в ранней Джаве любой класс создавался конструктором, например
Kokoko kokoko = new Kokoko("Ko");
Пришел Джошуа Блох и сказал, что это неправильно: конструктор должен быть скрыт
(или protected), а потребителям давать статичные методы, скажем .parse
,
.fromString
, .of
и так далее:
Kokoko kokoko = Kokoko.parse("Kokoko")
Kokoko kokoko = Kokoko.of(Sounds.KOKOKO)
Беда в том, что в списке методов не видно, какой из них отвечает за создание
экземпляра. Он может быть первым в списке, двадцатым, сорок вторым. Ты должен
знать, что где-то на третьем экране есть метод .parse
, который делает то, что
нужно.
Более веселые вещи: иные экземпляры нельзя создать в принципе. При запуске JVM порождается скрытый синглтон, и статический метод .getInstance возвращает ссылку на его. Считается, что ты прочитал все методы и понял, что нужно так:
Kokoko kokoko = Kokoko.getInstance();
kokoko.processKokoko("Kwish")
Бывает, даже когда прочитал все методы, все равно неясно, как создать объект. Оказывается, это такой дизайн: класс можно создать только из билдера — другого класса:
KokoBuilder builder = KokoBuilder.builder().with("Kwhish");
Kokoko kokoko = builder.build();
Еще бывают фабрики, но по-моему, это то же самое, что и билдер, только менее замшелое. Блох пишет про билдеры, а про фабрики — ничего.
Бывают статичные классы—агрегаторы. На деле это пачка функций, которые строят объекты других классов, например:
Kokoko kokoko = KokoManager.newSingleThreadKokoko("Kwesh");
Обо всем этом нужно знать, брать во внимание.
Нам рассказывали, что с ООП наступит пони и радуга. Будем строить программы из одинаковых блоков, все системно и предсказуемо. На деле Джавные классы — это не блоки, а паззлы. С виду одинаковые, но каждая дырка и пупырка своей формы и длины, и отыскать совпадение — большая удача.
Разнообразие в классах можно списать на долгую историю Джавы. Но сегодня нет ни одной качественной переработки ООП, и происходит откат к привычным “структура-функция”. Мне запомнился только Егор с его Элегантными объектами. Книга интересная, но когда я увидел “элегантный” код, мне немножко поплохело.
Я считаю две вещи. Первая: к объектам нужно переходить, только когда процедурный подход уже не справляется. Запас прочности у него огромный, хватит на десятилетия (см. Postgres). Вторая: над концепцией классов нужно хорошенько подумать. На мой взгляд, она не завершена.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter