【问题标题】:Using a user defined method in an Android Library Java在 Android 库 Java 中使用用户定义的方法
【发布时间】:2012-06-05 16:49:28
【问题描述】:

我正在实现一个可供许多不同类型的媒体播放器使用的库。我需要使用 getPosition 方法,该方法会因每个用户的视频播放器而异。

目前,为了实现这一点,我已将我的库设为用户必须扩展的抽象类,然后用他们用来获取媒体播放器位置的任何对象/方法覆盖 getPosition 方法。

我正在努力使我的类不必是抽象的,并且他们可以为我的库定义这个 getPosition 方法,而不必扩展我的抽象类(即)我不希望我的库类抽象一点。

我已经研究过使用反射,但我正在努力解决它,因为直到运行时我才知道类名/方法名/参数,并且我想要媒体播放器对象的特定实例的位置,以便我可以获得最新位置。

Java/Android 编程范式有什么好的做法?

反射是要走的路吗?如果是这样,我可以看到这个特定实例的一些示例代码(未知的类名/方法名/我的导入库使用的参数等...)

或者有没有更好的方法来完成这个/让我的类抽象成 Java 的方式?

如果用户不必扩展我的类并且可以只在对象上调用某种 setGetPosition() 方法,我更愿意。

编辑: 简单地说:我希望能够在我的库中使用未知类的 getPosition 方法,但我不希望我的整个类都是抽象的

【问题讨论】:

  • 我不确定我是否理解反射是如何进入这个问题的。如果您想在不使用抽象基类的情况下强制执行方法签名,请创建一个接口。您可能希望收紧问题以提供进一步的说明。
  • 很抱歉,但在您[直接]使用它们之前,将抽象类保留为抽象类通常是一种很好的编程习惯。
  • 如果可以避免,就不要使用 reflection,在 Android/Dalvik 上速度太慢了
  • 所以反射 = 不好,对于 android。但是@DaveNewton 您是否建议我创建一个包含用户可以定义的 getPosition 方法的位置接口?简单地说:我希望能够在我的库中使用未知类的 getPosition 方法,但我不希望我的整个类都是抽象的反射只是我努力实现这一目标的一种可能性。
  • @VinC 移动回答;有点多的评论。

标签: android reflection dynamic methods


【解决方案1】:

这就是接口的用途——强制执行 API 义务。

实现Positionable(或其他)的类可以(a)引用为Positionable,并且(b)处理对Positionable的方法的调用,例如getPosition

考虑List 接口:implements List 的任何类都必须有一堆特定的方法,但它们不需要是子类。 他们可能是一个子类,但不是必须

一般来说,“插件”系统允许任意实现特定功能,并且使用接口指定功能。接口是 Java 提供的用于强制类遵守规范的最基本机制之一。

插件可能使用反射,但有额外的开销、额外的复杂性,并且允许不良的运行时行为正是因为没有像接口那样的编译器强制执行。

【讨论】:

  • 我使用了一个接口来实现一个可定位的对象并将它传递给我的构造函数并且它工作了!非常感谢 Dave 的所有帮助,我真的很感激。
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 2014-01-21
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多