Анд, я думаю, что вы приближаетесь к этому - каламбур НЕ предназначен - с ненужной степенью абстракции. Я думаю, что этот (ИМХО) ненужный уровень абстракции - вот что вызывает здесь «проблему». Возможно, вы подходите к этому из математического теоретического подхода, где многие из нас подходят к этому из подхода «программист пытается решить проблемы». Я считаю, что это различие в подходах вызывает разногласия.
Когда программисты смотрят на практичность и как на самом деле реализовать что-то, бывает несколько раз, когда вам нужен какой-то совершенно произвольный Объект, фактический экземпляр которого не имеет никакого значения. Это просто не может быть нулевым. Пример, который я привел в комментарии к другому сообщению, - это реализация *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
отлично справляется с этой ролью и (ИМХО) очень чисто.
Я бы предположил, что этот является одной из причин, по которой Object
не был объявлен абстрактным: это прямо полезно, чтобы этого не было.