为什么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 (对于><=>=