52

java.util.Observableが具象クラスであることに気づきました。Observableの目的は拡張されることなので、これは私にはかなり奇妙に思えます。このように実装された理由はありますか?

私はそれを言うこの記事を見つけました

オブザーバブルは具象クラスであるため、Javaでは単一の継承しか許可されていないため、オブザーバブルから派生するクラスを事前に決定する必要があります。

しかし、それは私にはそれを本当に説明していません。実際、Observableが抽象的である場合、ユーザーはそれから派生するクラスを決定することを余儀なくされます。

4

2 に答える 2

116

非常に単純に、 Observableが抽象的であろうとなかろうと、クラスであるというのは間違いです。

Observableインターフェースである必要があり、JDKは便利な実装を提供する必要があります(ListインターフェースでArrayListあり、実装であるのとよく似ています)

Javaには、次のようなかなりの数の「間違い」があります。

石鹸箱にいる間、言語自体に関して、私見:

  • ==メソッドを実行する必要があり.equals()ます(これは頭痛の種の負荷を引き起こします)
  • IDの比較==は、===JavaScriptのようなものか、のような専用のメソッドのいずれかでboolean isIdentical(Object o)ある必要があります。これは、ほとんど必要ないためです。
  • <compareTo(Object o) < 0オブジェクトに対して実行する必要がComparableあります(および、、、に対しても同様>に)<=>=
于 2011-09-02T13:43:33.117 に答える
31

最初のアプローチとして、これはユーザーが継承の代わりに構成を使用できるようにするために行われると考えることができます。これは、クラスがすでに別のクラスから継承し、Observableクラスからも継承できない場合に非常に便利です。

しかし、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で構成されるクラスからは、このフラグを変更することはできません。これはプライベートであり、変更するために提供されるメソッドが保護されているためです。

これは、ユーザーがObservableクラスをサブクラス化することを余儀なくされていることを意味し、「abstract」キーワードの欠如は単なる「間違い」であると言えます。

このクラスは完全な失敗だと思います。

于 2011-09-02T14:57:12.260 に答える