7

Bluetoothベースのマルチセンサー(SensorDrone)に接続するアプリを開発しています。合計約 15 個のセンサーが含まれており、そのすべてが、チップのメーカーが作成したサードパーティのクローズド ソース ライブラリを使用して Android デバイスと通信できます。

サードパーティ ライブラリでは、データが使用可能になったときに起動される各センサーの関数を含むカスタム Java EventListener を実装する必要があります。

DroneEventListener droneEventListener = new DroneEventListener() {

    @Override
    public void temperatureMeasured(EventObject arg0) {
        readTemperatureFromDrone();
    }

    @Override
    public void pressureMeasured(EventObject arg0) { /*...*/ }

// Etc...

    @Override
    public void disconnectEvent(EventObject arg0) {
        // Let the user know the bluetooth connection was lost
    }

    @Override
    public void connectEvent(EventObject arg0) {
        // Let the user know the device was connected
    }


};

ただし、funfという別のライブラリを使用して、Android の組み込みセンサーからも情報を取得したいと考えています。このライブラリは、組み込みの Android センサーと外部センサーの両方のデータを収集するのに最適です。これは、カスタムの " Probe " 実装を作成できるようにすることで実現します。ただし、プローブは (ライブラリと規則からの提案により) 一度に 1 つのセンサーにのみ使用することを意図しています。

元の質問:

それで、私の質問はこれです。DroneEventListener() クラスを特定のセンサーに分割することは可能ですか? その後、マルチセンサーの各センサーのカスタム プローブを簡単に作成できました。

概念的には開発者の契約であるため、抽象クラスを細分化しようとするのは悪い習慣である可能性があることを認識しています。ただし、このコードを既存の信頼性の高い適切に管理されたライブラリ ( funf ) で動作させるための軽度のハックは、それだけの価値があると思います。

あるいは、製造元のライブラリを funf で使用できるようにする他の創造的なソリューションはありますか?

編集 (2013 年 6 月 24 日):

「細分化」という表現の使用は、私だけが理解できるものであると判断しました。私は基本的に、使用していたのが 1 つしかないときに 20 代の空のメソッドを実装したくないということを意味していました。選択した答えは、それを行う方法を正確に説明しています。

洗練された質問:

乱雑な空のメソッドを実装することなく、EventListener (複数の関数を持つ) から 1 つの関数だけを実装することは可能ですか?

4

3 に答える 3

2

すべてのイベントを処理するために 1 つのメソッドのみを使用する場合は、リダイレクトを処理する抽象クラスを作成できます。

このように、このメソッドを実装するだけですべてを処理できます。

public abstract DroneEventAdapter implements DroneEventListener {
    public abstract void eventOccured(EventObject event);

    @Override
    public void temperatureMeasured(EventObject event) {
        eventOccured(event);
    }

    @Override
    public void pressureMeasured(EventObject event) {
        eventOccured(event);
    }

    @Override
    public void disconnectEvent(EventObject event) {
        eventOccured(event);
    }

    @Override
    public void connectEvent(EventObject event) {
        eventOccured(event);
    }

    // Etc.
}

一部のイベントのみを実装し、他のすべての空のスタブを持たないことが必要な場合は、空のメソッドですべてのイベントを実装する抽象クラスを作成できます。これは「アダプター」と呼ばれ、JDK ではかなり頻繁に使用されます (たとえば、 MouseMotionListenerおよびMouseMotionAdapterを参照してください)。

このクラスを拡張すると、サポートしたいイベントのみをオーバーライドできます。

public abstract DroneEventAdapter implements DroneEventListener {
    @Override
    public void temperatureMeasured(EventObject event) {}

    @Override
    public void pressureMeasured(EventObject event) {}

    @Override
    public void disconnectEvent(EventObject event) {}

    @Override
    public void connectEvent(EventObject event) {}

    // Etc.
}
于 2013-06-25T10:12:11.710 に答える
1

あなたの洗練された質問に対する私の答え: EventListener の関数を 1 つだけ実装することは可能だと思いますが、空のスタブであっても、必要なすべてのメソッドをコードに含める必要があります。私はこれに何度か遭遇しましたが、実装する必要のないものを常に下部に空のスタブとして配置することになります。

于 2013-06-25T07:11:50.297 に答える