Why wasn’t the java.lang.Object class declared to be abstract ?
Surely for an Object to be useful it needs added state or behaviour, an Object class is an abstraction, and as such it should have been declared abstract … why did they choose not to ?
Ande, I think you are approaching this — pun NOT intended — with an unnecessary degree of abstraction. I think this (IMHO) unnecessary level of abstraction is what is causing the ‘problem’ here. You are perhaps approaching this from a mathematical theoretical approach, where many of us are approaching this from a ‘programmer trying to solve problems’ approach. I believe this difference in approach is causing the disagreements.
When programmers look at practicalities and how to actually implement something, there are a number of times when you need some totally arbitrary Object whose actual instance is totally irrelevant. It just cannot be null. The example I gave in a comment to another post is the implementation of
*Set(*==HashorConcurrentor type of choice), which is commonly done by using a backing*Mapand using theMapkeys as the Set. You often cannot usenullas theMapvalue, so what is commonly done is to use a staticObjectinstance as the value, which will be ignored and never used. However, some non-null placeholder is needed.Another common use is with the
synchronizedkeyword where someObjectis needed to synchronize on, and you want to ensure that your synchronizing item is totally private to avoid deadlock where different classes are unintentionally synchronizing on the same lock. A very common idiom is to allocate aprivate final Objectto use in a class as the lock. To be fair, as of Java 5 andjava.util.concurrent.locks.Lockand related additions, this idiom is measurably less applicable.Historically, it has been quite useful in Java to have
Objectbe instantiable. You could make a good point that with small changes in design or with small API changes, this would no longer be necessary. You’re probably correct in this.And yes, the API could have provided a
Placeholderclass that extendsObjectwithout adding anything at all, to be used as a placeholder for the purposes described above. But — if you’re extendingObjectbut adding nothing, what is the value in the class other than allowingObjectto be abstract? Mathematically, theoretically, perhaps one could find a value, but pragmatically, what value would it add to do this?There are times in programming where you need an object, some object, any concrete object that is not null, something that you can compare via
==and/or.equals(), but you just don’t need any other feature to this object. It exists only to serve as a unique identifier and otherwise does absolutely nothing.Objectsatisfies this role perfectly and (IMHO) very cleanly.I would guess that this is part of the reason why
Objectwas not declared abstract: It is directly useful for it not to be.