当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Java:Object类的基本原理未被声明为abstract》经验,为你挑选了2个好方法。

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

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



1> andri..:

一个Object即使没有任何状态或行为具体到它是有用的.

一个例子是它用作用于同步的通用防护:

public class Example {
    private final Object o = new Object();

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

虽然这个类在它的实现中有点简单(这里不明显为什么有一个显式对象是有用的,你可以只声明方法synchronized)有几种情况,这是非常有用的.


@TofuBeer:我希望有人在1.0上工作会发布"哎呀".大声笑

2> Eddie..:

安德,我认为你正在接近这个 - 不是意图 - 不必要的抽象程度.我认为这个(恕我直言)不必要的抽象层次是造成这里"问题"的原因.您可能正在从数学理论方法中接近这一点,我们中的许多人正在从"试图解决问题的程序员"方法中接近这一点.我认为这种方法的不同导致了分歧.

当程序员看实用性以及如何实际实现某些东西时,有很多次你需要一些完全任意的Object,其实际的实例是完全不相关的.它不能为空.我在另一篇文章的评论中给出的例子是*Set(*== HashConcurrent或者选择的类型)的实现,这通常通过使用支持*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没有被宣布为抽象的部分原因:它直接对它有用.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有