安德,我认为您正在以不必要的抽象程度接近此目标(双关不是故意的)。我认为这种(IMHO)不必要的抽象级别是造成此处“问题”的原因。也许您是从数学理论方法来解决这个问题的,而我们中的许多人都是从“试图解决问题的程序员”的方法解决这个问题的。我认为这种方法上的差异导致了分歧。
当程序员着眼于实用性以及如何实际 实现
某些东西时,有时会需要一些完全与实际实例无关的任意对象。它不能为空。我在另一篇文章的评论中给出的示例是
*Set(
*==
Hash或
Concurrent选择类型)的实现,通常是通过使用背景
*Map并将
Map键用作Set来实现的。您通常不能将其
null用作
Map值,因此通常要做的是使用静态
Object实例作为值,该实例将被忽略并且从不使用。但是,需要一些非空的占位符。
另一个常见的用途是与
synchronized其中的关键字 有些
Object是需要同步,并且要确保你的同步产品完全私人避免死锁,不同的类无意中在同一个锁进行同步。一个非常常见的习惯用法是分配一个
privatefinal Object在类中用作锁的语言。公平地讲,从Java
5和
java.util.concurrent.locks.Lock相关的附加功能开始,该习惯用法明显不太适用。
从历史上看,
Object可实例化在Java中非常有用。您可能会指出,只要对设计进行较小的更改或对API进行较小的更改,就不再需要这样做。您可能是正确的。
是的,API可能已经提供了一个
Placeholder扩展类,
Object根本不添加任何内容,就可以用作上述目的的占位符。但是-
如果您要扩展
Object但什么也不添加,那么除了允许
Object抽象之外,该类中的值是什么?从数学上讲,理论上也许可以找到一个价值,但在实用上,这样做会增加什么价值呢?
在编程中有时需要一个对象, 某个 对象, 任何
不为null的具体对象,可以通过
==和/或进行比较的对象
.equals(),但是您不需要此对象的任何其他功能。它仅作为唯一标识符存在,否则绝对不起作用。
Object完美地(IMHO)完全满足此角色。
我想 这 就是为什么
Object不声明为抽象的部分原因:不声明它是直接有用的。



