Без дизайнеров java.lang.Object
, рассказывая нам, мы должны основывать наши ответы на мнениях. Есть несколько вопросов, которые можно задать, которые могут помочь в его устранении.
Может ли какой-либо из методов Object быть абстрактным?
Можно утверждать, что некоторые из методов выиграют от этого. Например, возьмите hashCode()
и equals()
, вероятно, было бы гораздо меньше разочарований в сложностях этих двух, если бы они были сделаны абстрактными. Это потребует от разработчиков выяснить, как они должны их реализовывать, делая более очевидным, что они должны быть последовательными (см. Эффективная Java). Тем не менее, я больше придерживаюсь мнения, что hashCode()
, equals()
и clone()
принадлежат к отдельным абстракциям opt-in (то есть интерфейсам). Другие методы, wait()
, notify()
, finalize()
и т. Д. Являются достаточно сложными и/или являются родными, поэтому лучше всего, что они уже реализованы и не могут быть абстрагированы.
Итак, я бы догадался, что ответ будет отрицательным, ни один из методов Объекта не станет абстрактным.
Было бы полезно отметить класс Object как абстрактный?
Предполагая, что все методы реализованы, единственным эффектом маркировки абстрактного объекта является то, что он не может быть сконструирован (т. Е. new Object()
- ошибка компиляции). Это принесет пользу? Я считаю, что термин «объект» сам по себе абстрактный (можете ли вы найти что-нибудь вокруг вас, которое может быть полностью описано как «объект»?), Поэтому оно будет соответствовать объектно-ориентированной парадигме. Однако на стороне пуриста. Можно утверждать, что заставить разработчиков выбрать имя для любого конкретного подкласса, даже пустые, приведет к коду, который лучше выражает их намерение. Я думаю, чтобы быть полностью правильной с точки зрения парадигмы, объект должен быть помечен abstract
, но когда дело доходит до него, нет никакой реальной выгоды, это вопрос предпочтений дизайна (прагматизм против чистоты).
Является ли практика использования простого объекта для синхронизации достаточной причиной для его конкретного?
Многие другие ответы говорят о создании простого объекта для использования в операции synchronized()
. Хотя это, возможно, была распространенной и общепринятой практикой, я не считаю, что было бы достаточно хорошей причиной, чтобы объект был абстрактным, если дизайнеры хотели, чтобы это было. В других ответах упоминалось, как мы должны объявить один пустой класс под любым объектом, который мы хотели бы синхронизировать на определенном объекте, но это не выдерживает - в SDK может быть предоставлен пустой подкласс (java.lang.Lock
или любой другой), который можно было бы построить в любое время, когда мы хотели синхронизировать. Это будет иметь дополнительное преимущество для создания более сильного заявления о намерениях.
Есть ли какие-либо другие факторы, на которые могло оказать неблагоприятное воздействие создание абстрактного объекта?
Существует несколько областей, отделенных от точки зрения чистого дизайна, которые могут повлиять на выбор. К сожалению, я не знаю достаточно о них, чтобы расширить их. Однако, это не удивит меня, если любой из них оказали влияние на решение:
- Performance
- безопасности
- простота реализации JVM
Может ли быть другие причины ?
Было упомянуто, что оно может быть связано с отражением. Тем не менее, отражение было введено после создания объекта. Так ли это влияет на отражение или нет спорно - это не причина. То же самое для дженериков.
Существует также незабываемая точка, в которой java.lang.Object был спроектирован людьми: они, возможно, допустили ошибку, возможно, они не рассмотрели вопрос. Нет языка без недостатков, и этот может быть одним из них, но если это так, это вряд ли будет большой. И я думаю, что могу без лишних амбиций сказать, что я вряд ли буду участвовать в разработке ключевой части такой широко используемой технологии, особенно той, которая длится 15 лет (?) И все еще сильна, поэтому это не следует рассматривать как критику.
Сказав это, я бы сделал это абстрактный ;-p
Резюме
В принципе, насколько я понимаю, что ответ на оба вопроса «Почему java.lang.Object бетон? " или (если бы это было так) «Почему java.lang.Object abstract?» это ... «Почему бы и нет?».
+1, это сразу заставило меня подумать об одном и том же вопросе, но в отношении языков на основе .NET –
Кажется, что возникает много путаницы в вопросе; абстрактным классам не нужны абстрактные методы. Скорее, вопрос задает вопрос: «Есть ли какая-то настоящая причина, по которой мы нуждаемся, чтобы иметь возможность« new Object();?? » Если нет, 'Object' должен быть абстрактным. –
Флипсайд, а ИМО - лучший вопрос, который нужно задать: «Есть ли настоящая необходимость? Объект должен быть абстрактным?» Нет. Так что это должно быть конкретным. –