为什么java.lang.Object
声明的类不是抽象的?
当然,对于一个有用的Object,它需要添加状态或行为,Object类是一个抽象,因此它应该被声明为abstract ... 为什么他们选择不这样做?
一个Object
即使没有任何状态或行为具体到它是有用的.
一个例子是它用作用于同步的通用防护:
public class Example { private final Object o = new Object(); public void doSomething() { synchronized (o) { // do possibly dangerous stuff } } }
虽然这个类在它的实现中有点简单(这里不明显为什么有一个显式对象是有用的,你可以只声明方法synchronized
)有几种情况,这是非常有用的.
安德,我认为你正在接近这个 - 不是意图 - 不必要的抽象程度.我认为这个(恕我直言)不必要的抽象层次是造成这里"问题"的原因.您可能正在从数学理论方法中接近这一点,我们中的许多人正在从"试图解决问题的程序员"方法中接近这一点.我认为这种方法的不同导致了分歧.
当程序员看实用性以及如何实际实现某些东西时,有很多次你需要一些完全任意的Object,其实际的实例是完全不相关的.它不能为空.我在另一篇文章的评论中给出的例子是*Set
(*
== Hash
或Concurrent
或者选择的类型)的实现,这通常通过使用支持*Map
并使用Map
键作为Set来完成.您通常不能将其null
用作Map
值,因此通常所做的是使用静态Object
实例作为值,该值将被忽略且从未使用过.但是,需要一些非null占位符.
另一个常见的用途是使用synchronized
关键字,其中 Object
需要一些同步,并且您希望确保您的同步项完全是私有的,以避免死锁,其中不同的类无意中在同一个锁上同步.一个非常常见的习惯用法是private final Object
在类中分配一个用作锁.公平地说,从Java 5和java.util.concurrent.locks.Lock
相关的附加内容来看,这个习惯用法显然不太适用.
从历史上看,Java Object
在实例化方面非常有用.您可以提出一个很好的观点,即如果设计变化很小或API变化较小,则不再需要这样做.你可能在这方面是正确的.
是的,API可以提供一个Placeholder
扩展的类Object
而不添加任何东西,以用作上述目的的占位符.但是 - 如果你正在扩展Object
但没有添加任何东西,除了允许Object
抽象之外,课堂上的价值是多少?数学上,从理论上讲,也许人们可以找到一个价值,但实际上,它会增加什么价值呢?
在编程中,有时候你需要一个对象,一些对象,任何非空的具体对象,你可以通过==
和/或比较的东西.equals()
,但你只需要这个对象的任何其他功能.它仅作为唯一标识符存在,否则绝对不存在. Object
完美地满足这个角色和(恕我直言)非常干净.
我猜这是为什么Object
没有被宣布为抽象的部分原因:它直接对它有用.