7

我正在开发一个应用程序来连接到基于蓝牙的多传感器(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 传感器和外部传感器收集数据。它通过允许您创建自定义“探针”来实现这一点”实现来做到这一点。但是,探针意味着(根据图书馆和惯例的建议)一次仅用于一个传感器。

原始问题:

所以,我的问题是这样的;是否有可能以某种方式将 DroneEventListener() 类细分为特定的传感器?之后,我可以轻松地为多传感器上的每个传感器创建一个自定义探针。

我意识到尝试细分抽象类可能是不好的做法,因为它在概念上是开发人员的合同。但是,我觉得让这个代码与预先存在的、可靠且维护良好的库 ( funf ) 一起工作的温和 hack 是值得的。

或者,是否有任何其他创造性的解决方案可以让我将制造商的库与 funf 一起使用?

编辑(2013 年 6 月 24 日):

我已经决定我对“细分”一词的使用只有我自己清楚。我的意思是,当我只使用一个时,我不想实现 20 多岁的空白方法。选择的答案准确地解释了如何做到这一点。

细化问题:

是否可以只实现 EventListener 中的一个函数(具有多个函数)而不必实现混乱的空方法?

4

3 回答 3

2

如果您只想使用一种方法来处理每个事件,您可以创建一个处理重定向的抽象类。

这样,您只需实现此方法即可处理所有事情。

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 中非常常见(例如,参见MouseMotionListenerMouseMotionAdapter)。

扩展此类时,您将只能覆盖您想要支持的事件。

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 回答
2

您不能拆分 DroneEventListener,但可以让它将其事件处理委托给每个传感器的不同对象。

class SplittingListener implements Drone.DroneEventListener {
    public void adcMeasured(java.util.EventObject event) {
        adcProbe.heyAThingHappened(event);
    }
    public void altitudeMeasured(java.util.EventObject event) {
        altitudeProbe.itsYourProblemNow(event);
    }
    public void capacitanceMeasured(java.util.EventObject event) {
        capacitanceProbe.passTheBuck(event);
    }

    // ...
}
于 2013-06-21T01:18:03.363 回答
1

我对您提炼的问题的回答:我相信可以只实现 EventListener 的一个功能,但是您仍然需要在代码中拥有它所需的所有方法,即使是空存根。我已经多次遇到这种情况,但我最终总是将那些我不需要实现为底部的空存根。

于 2013-06-25T07:11:50.297 回答