Анд, я думаю, вы приближаетесь к этому - каламбур НЕ предназначен - с ненужной степенью абстракции. Я думаю, что этот (ИМХО) ненужный уровень абстракции является тем, что вызывает здесь «проблему». Возможно, вы приближаетесь к этому с математического теоретического подхода, когда многие из нас приближаются к этому с подхода «программист, пытающийся решить проблемы». Я считаю, что это различие в подходах вызывает разногласия.
Когда программисты смотрят на практичность и как на самом деле реализуют что-то, есть несколько раз, когда вам нужен какой-то полностью произвольный объект фактический пример которого совершенно не имеет значения. Он просто не может быть нулевым. Пример, который я дал в комментарии к другому сообщению, - это реализация *Set
(*
== Hash
или Concurrent
или тип выбора), который обычно выполняется с использованием поддержки *Map
и использования Map
в качестве набора. Вы часто не можете использовать null
как значение Map
, поэтому обычно делается попытка использовать статический экземпляр Object
как значение, которое будет игнорироваться и никогда не будет использоваться. Однако необходим некоторый ненулевой заполнитель.
Еще одно распространенное использование с ключевым словом synchronized
, где требуется некоторое Object
для синхронизации, и вы хотите обеспечить что ваш синхронизированный элемент полностью закрыт, чтобы избежать тупиковой ситуации, когда разные классы непреднамеренно синхронизируются с одной и той же блокировкой. Очень распространенная идиома заключается в том, чтобы выделить private final Object
для использования в классе как блокировку. Справедливости ради следует отметить, что по сравнению с Java 5 и java.util.concurrent.locks.Lock
и связанными дополнениями эта идиома заметно менее применима.
Исторически сложилось так, что на Java было очень полезно иметь Object
. Вы могли бы сказать, что с небольшими изменениями в дизайне или с небольшими изменениями API это больше не понадобится. Вы, вероятно, правы в этом.
И да, API мог бы предоставить класс Placeholder
, который расширяет Object
без добавления чего-либо вообще, для использования в качестве заполнителя для целей, описанных выше , Но - если вы расширяете Object
, но ничего не добавляете, каково значение в классе, кроме того, что разрешить Object
быть абстрактным? Математически, теоретически, возможно, можно было бы найти значение, но прагматически, какое значение он мог бы добавить для этого?
В программировании есть моменты, когда вам нужен объект, некоторый объект , любой конкретный объект , который не является нулевым, что вы можете сравнить с помощью ==
и / или .equals()
, но вам просто не нужна какая-либо другая функция для этого объекта. Он существует только для того, чтобы служить уникальным идентификатором и в противном случае абсолютно ничего не делает. Object
удовлетворяет эту роль отлично и (IMHO) очень чисто.
Я бы предположил, что это является частью причины, по которой Object
не был объявлен абстрактным: для него это просто не полезно.