Java:未声明为抽象的对象类的基本原理 3 周,2 日 Questions & Answers 1356 为什么java.lang.Object类没有声明为抽象类 当然,对于一个有用的对象来说,它需要添加状态或行为,对象类是一个抽象,因此它应该被声明为抽象的他们为什么选择不这么做强>
# 1 楼答案 您可以为同步锁实例化Object: 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 } }
# 3 楼答案 安德,我认为你正在以一种不必要的抽象程度来处理这个问题——这不是双关语的本意。我认为这种(IMHO)不必要的抽象层次是造成这里“问题”的原因。你可能是从数学理论的角度来看待这个问题,我们中的许多人是从“程序员试图解决问题”的角度来看待这个问题的。我认为这种方法上的差异导致了分歧 当程序员研究实用性以及如何实际实现某个东西时,有时你需要一些完全任意的对象,而这些对象的实际实例是完全无关的。它不能为空。我在另一篇帖子的评论中给出的例子是*Set(*=Hash或Concurrent或选择类型)的实现,这通常是通过使用支持*Map并使用Map键作为集来实现的。通常不能使用null作为Map值,因此通常使用静态Object实例作为值,该实例将被忽略且永远不会使用。但是,需要一些非空占位符 另一个常见用法是使用synchronized关键字,其中需要一些Object来同步,并且您希望确保同步项是完全私有的,以避免不同类在同一个锁上无意同步时出现死锁。一个非常常见的习惯用法是分配一个private final Object在类中用作锁。公平地说,在Java5和java.util.concurrent.locks.Lock以及相关的附加版本中,这个习惯用法的适用性要小得多 从历史上看,在Java中使Object可实例化是非常有用的。你可以提出一个很好的观点,即对于设计中的小变化或API的小变化,这将不再是必要的。你可能是对的 是的,API本可以提供一个Placeholder类,该类在不添加任何内容的情况下扩展Object,用作上述用途的占位符。但是——如果你扩展了Object,但什么都不添加,那么除了允许Object是抽象的之外,类中还有什么价值呢?从数学上,理论上,也许一个人可以找到一个值,但从实用的角度来看,它会增加什么价值呢 在编程中,有时需要一个对象,一些对象,任何不为空的具体对象,可以通过==和/或.equals()进行比较,但不需要该对象的任何其他特性。它的存在只是作为一个唯一的标识符,否则就完全不起任何作用^{cdho}完全满足了这个角色 我猜这是Object没有被宣布为抽象的部分原因:不被宣布为抽象是直接有用的
# 4 楼答案 一个Object是有用的,即使它没有任何特定的状态或行为 一个例子是将其用作用于同步的通用保护: public class Example { private final Object o = new Object(); public void doSomething() { synchronized (o) { // do possibly dangerous stuff } } } 虽然这个类的实现有点简单(这里不清楚为什么显式对象很有用,您可以只声明方法synchronized),但在一些情况下,这是非常有用的
# 5 楼答案 Object怎么会比null更具攻击性呢 它是一个很好的位置标记(不管怎样,它与空标记一样好) 此外,我认为,如果没有一个抽象的方法来抽象一个对象,那将不是一个好的设计 我并不是说空值是自切片面包以来最好的东西——前几天我读了一篇“发明家”的文章,讨论了空值概念的成本/价值。。。(我甚至不认为空是可以发明的!我想某处的人可能会声称他发明了零。)只是能够实例化对象并不比能够传递null差
# 6 楼答案 我不确定这是否是原因,但它允许(或允许,因为现在有更好的方法)将对象用作锁: Object lock = new Object(); .... synchronized(lock) { }
# 1 楼答案
您可以为同步锁实例化
Object
:# 2 楼答案
对象是否指定了扩展它的类必须实现的方法以使其有用?不,因此它不必是抽象的
抽象类的概念有一个定义良好的含义,但不适用于对象
# 3 楼答案
安德,我认为你正在以一种不必要的抽象程度来处理这个问题——这不是双关语的本意。我认为这种(IMHO)不必要的抽象层次是造成这里“问题”的原因。你可能是从数学理论的角度来看待这个问题,我们中的许多人是从“程序员试图解决问题”的角度来看待这个问题的。我认为这种方法上的差异导致了分歧
当程序员研究实用性以及如何实际实现某个东西时,有时你需要一些完全任意的对象,而这些对象的实际实例是完全无关的。它不能为空。我在另一篇帖子的评论中给出的例子是
*Set
(*
=Hash
或Concurrent
或选择类型)的实现,这通常是通过使用支持*Map
并使用Map
键作为集来实现的。通常不能使用null
作为Map
值,因此通常使用静态Object
实例作为值,该实例将被忽略且永远不会使用。但是,需要一些非空占位符另一个常见用法是使用
synchronized
关键字,其中需要一些Object
来同步,并且您希望确保同步项是完全私有的,以避免不同类在同一个锁上无意同步时出现死锁。一个非常常见的习惯用法是分配一个private final Object
在类中用作锁。公平地说,在Java5和java.util.concurrent.locks.Lock
以及相关的附加版本中,这个习惯用法的适用性要小得多从历史上看,在Java中使
Object
可实例化是非常有用的。你可以提出一个很好的观点,即对于设计中的小变化或API的小变化,这将不再是必要的。你可能是对的是的,API本可以提供一个
Placeholder
类,该类在不添加任何内容的情况下扩展Object
,用作上述用途的占位符。但是——如果你扩展了Object
,但什么都不添加,那么除了允许Object
是抽象的之外,类中还有什么价值呢?从数学上,理论上,也许一个人可以找到一个值,但从实用的角度来看,它会增加什么价值呢在编程中,有时需要一个对象,一些对象,任何不为空的具体对象,可以通过
==
和/或.equals()
进行比较,但不需要该对象的任何其他特性。它的存在只是作为一个唯一的标识符,否则就完全不起任何作用^{cdho}完全满足了这个角色我猜这是
Object
没有被宣布为抽象的部分原因:不被宣布为抽象是直接有用的# 4 楼答案
一个
Object
是有用的,即使它没有任何特定的状态或行为一个例子是将其用作用于同步的通用保护:
虽然这个类的实现有点简单(这里不清楚为什么显式对象很有用,您可以只声明方法
synchronized
),但在一些情况下,这是非常有用的# 5 楼答案
Object怎么会比null更具攻击性呢
它是一个很好的位置标记(不管怎样,它与空标记一样好)
此外,我认为,如果没有一个抽象的方法来抽象一个对象,那将不是一个好的设计
我并不是说空值是自切片面包以来最好的东西——前几天我读了一篇“发明家”的文章,讨论了空值概念的成本/价值。。。(我甚至不认为空是可以发明的!我想某处的人可能会声称他发明了零。)只是能够实例化对象并不比能够传递null差
# 6 楼答案
我不确定这是否是原因,但它允许(或允许,因为现在有更好的方法)将对象用作锁: