Java对象的类:Object类的基本原理未被声明为abstract

Java: Rationale of the Object class not being declared abstract

为什么不将java.lang.Object类声明为抽象类?

当然,对于一个有用的对象,它需要添加状态或行为,对象类是一个抽象,因此它应该被声明为抽象的…他们为什么不选择?


即使没有特定的状态或行为,也会使用。

One example would be its use a s a generic guard that's used for symporanization:

1
2
3
4
5
6
7
8
9
public class Example {
    private final Object o = new Object();

    public void doSomething() {
        synchronized (o) {
            // do possibly dangerous stuff
        }
    }
}

当这一类别在其实施中是一个简单的比特(这不明显是为什么它需要有一个解释性的目标,你可以宣布方法synchronized)时,有几种实际使用的例子。


安德,我认为你是在以一种不必要的抽象程度来接近这一点——不是有意的。我认为这(imho)不必要的抽象级别是导致这里的"问题"的原因。您可能是从数学理论的方法来实现这一点的,我们中的许多人都是从"试图解决问题的程序员"的方法来实现这一点的。我认为这种方法上的差异导致了分歧。

当程序员看到实用性和如何实际实现某些东西时,有很多次您需要一些完全任意的对象,而这些对象的实际实例完全不相关。它不能为空。我在对另一篇文章的评论中给出的例子是*Set(*==HashConcurrent或选择类型的实现,这通常是通过使用支持*Map并使用Map键作为集合来完成的。您通常不能使用null作为Map值,因此通常使用静态Object实例作为值,这将被忽略并且永远不会使用。但是,需要一些非空的占位符。

另一个常见的用法是使用synchronized关键字,其中需要一些Object来同步打开,并且您希望确保同步项是完全私有的,以避免在不同类无意间在同一锁上同步时出现死锁。一个非常常见的习惯用法是分配一个private final Object在类中用作锁。公平地说,对于Java 5和EDCOX1(12)和相关的添加,这个习惯用法是不太适用的。

从历史上讲,在EDCOX1中,8是非常实例化的。您可以指出,在设计上进行小的更改或API进行小的更改时,这将不再是必需的。你可能是对的。

是的,API可以提供一个扩展ObjectPlaceholder类,而不添加任何内容,作为上述用途的占位符。但是——如果扩展Object,但不添加任何内容,那么类中除了允许Object是抽象的之外还有什么值?从数学上讲,理论上讲,也许人们可以找到一个值,但从实用主义上讲,这样做会增加什么值?

在编程中,有时您需要一个对象,一些对象,任何不为空的具体对象,一些可以通过==和/或.equals()进行比较的对象,但是您不需要任何其他特性。它的存在只是作为一个唯一的标识符,否则什么也不做。Object完全满足了这个角色,而且(imho)非常干净。

我想这就是为什么Object没有被声明为抽象的部分原因:它直接对不被声明是有用的。


对象特异性的方法是,类别必须扩展,以便于使用?不,所以不需要抽象。

一个类别作为抽象的概念有一个很好的定义,它不适用于对象。


您可以安装同步锁定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Object lock = new Object();

void someMethod() {
  //safe stuff
  synchronized(lock) {
     //some code avoiding race condition
  }
}

void someOtherMethod() {
  //safe code
  synchronized(lock) {
    //some other stuff avoiding race condition
  }
}

比零更大的进攻目标是什么?

这是一个很好的位置标记(好像没有任何东西)。

我也不认为这是一个好的设计,如果没有一个抽象的方法需要去做一个抽象的对象。

我不是说没有什么是最好的东西,自从吃了面包以后——我在"发明家"的杂志上读了一篇文章我甚至不认为任何东西都是虚构的!我猜有人可能会在某个地方提出他发明的零。。。。。。。。


我不确定这是原因,但它允许(或允许,如今有更好的方式完成这项任务),以供作为锁定的对象使用:

ZZU1


你永远不知道什么时候你可能想用一个简单的对象作为安慰剂。把它当作一个数字系统中的一个零(而不为这个工作,因为没有数据)。


像往常一样,guava提供帮助:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/optional.html这里的内容可用于从代码中删除"非空占位符"的空值/对象实例。

这里有完全独立的问题:

  • 为什么不把物体抽象化?
  • 如果他们决定在将来的版本中将灾难抽象化,那么灾难会发生多少呢?

应该有理由将类抽象化。一种是防止客户机实例化类,并强制他们只使用子类(无论出于什么原因)。另一种是,如果您希望通过提供抽象方法将其用作接口,则子类必须实现抽象方法。也许,Java的设计者没有看到这样的原因,所以EDCX1〔22〕仍然是具体的。