【问题标题】:Possible to implement just one function from an EventListener with multiple functions?可以从具有多个功能的 EventListener 中仅实现一个功能吗?
【发布时间】:2013-06-18 02:30:18
【问题描述】:

我正在开发一个应用程序来连接基于蓝牙的多传感器 (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”实现来做到这一点。但是,探针意味着(根据图书馆和惯例的建议)一次仅用于一个传感器。

原问题:

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

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

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

编辑(2013 年 6 月 24 日):

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

提炼问题:

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

【问题讨论】:

    标签: java sensors android-sensors event-listener


    【解决方案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 中非常常见(例如,参见 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.
    }
    

    【讨论】:

    • 我简直不敢相信没有其他办法。为什么 Java 中没有单方法监听器?即使我只想要一个鼠标释放监听器,我也必须实现 5 个其他方法。这太愚蠢了
    • @Blauhirn 您可以扩展 MouseAdapter 并覆盖其 mouseReleased(...) 方法,而不是实现 MouseListener。这样看起来就好像你在实现一个单一方法的监听器。
    【解决方案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);
        }
    
        // ...
    }
    

    【讨论】:

    • 啊,另一个传感器无人机开发者?很高兴知道。我确实喜欢“推卸责任”的概念,但是通过这样的解决方案,我正在编写相同数量的 SensorDrone 库实现代码。有没有办法以某种方式“打破”实现类设定的合同?另外,如果这是唯一的解决方案,您认为我最好只使用未拆分的侦听器来实现它,并且只对内置的 Android 传感器使用 funf 吗?
    • 如果您只想处理来自一个传感器的事件,您根本无法在其他方法中执行任何操作。这仍然需要大量文本来声明所有这些未使用的方法,但您可能可以让您的 IDE 为您生成存根。 (方法繁重的 Listener 接口通常带有 Adapter 类,它们提供所有方法的无操作实现,因此您只需实现您需要的那些。看起来 DroneEventListener 真的可以使用 DroneEventAdapter。)
    • 我不认为我可以在不反编译库的情况下自己制作“DroneEventAdapter”?
    • 您可以让您的 IDE 在几秒钟内生成一个 DroneEventAdapter 类并使用它,尽管尝试将其作为 Drone 中的嵌套类或将其放入 com. sensorcon.sensordrone 包。
    • 对不起,迟到的评论。我在 EventAdapter 上做了一些阅读,它似乎准确地回答了我的问题。我想当我说“细分”时,我的意思是“让我只使用这个 EventListener 中的一个函数”的更概念化的方式。我将尝试联系 API 的创建者并建议他添加一些 EventAdapter。谢谢。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 2018-09-24
      相关资源
      最近更新 更多