为什么java.util.Observable不是抽象类?
我只注意到java.util.Observable是一个具体的类。 由于Observable的目的是被延伸的,这对我来说似乎很奇怪。 为什么这样实施是有原因的吗?
我发现这篇文章说这个
observable是一个具体的类,所以从它派生的类必须先确定,因为Java只允许单一的inheritance。
但这并不能解释给我。 事实上,如果Observable是抽象的,用户将被迫确定从它派生的类。
作为第一种方法,可以认为这样做是为了允许用户使用组合而不是inheritance, 如果您的类已经从另一个类inheritance ,并且您也不能从Observable类inheritance,那么这是非常方便的。
但是如果我们看Observable的源代码,我们会看到有一个内部标志
private boolean changed = false;
每当notifyObservers被调用时,
public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); }
但是从这个Observable组成的类中,我们不能改变这个标志 ,因为它是私有的,所提供的改变它的方法是受保护的。
这意味着用户被迫inheritance了Observable类,并且我认为缺less“abstract”关键字只是一个“错误”。
我会说这个class是一个完整的搞砸。
很简单, Observable完全是一个类,抽象的或其他的。
Observable
应该是一个接口 ,JDK应该提供了一个方便的实现(就像List
是一个接口,而ArrayList
是一个实现)
java中有很多“错误”,包括:
- java.util.Stack是一个类,而不是一个接口(如Observable,糟糕的select)
- java.util.Properties 扩展 java.util.Hashtable (而不是使用一个)
- java.util.Date类有点混乱, 不是 不可变的 !
- java.util.Calendar类是一个真正的混乱
- 没有无符号的“字节”types(这是一个真正的痛苦和许多低级别错误的来源)
- java.sql.SQLException是一个检查的exception
- 数组不使用
Arrays.toString(array)
作为它们的默认toString()
(这导致了多lessSO问题?) -
Cloneable
不应该是标记界面; 它应该有clone()
方法和Object.clone()
不应该存在
而在肥皂箱上 ,就语言本身而言,恕我直言:
-
==
应该执行.equals()
方法(这会导致大量的头痛) - 身份比较
==
应该是===
像JavaScript或像boolean isIdentical(Object o)
的专用方法,因为你几乎不需要它! -
<
对Comparable
对象执行compareTo(Object o) < 0
(对于>
,<=
,>=
)