【发布时间】:2015-05-06 16:50:40
【问题描述】:
假设我们有一个有很多视图的 Activity,要在其上注册 OnClickListener。
最常见的实现方式是让 Activity-Subclass 实现 OnClickListener,如下所示:
public class ActivityMain extends Activity implements View.OnClickListener
{
@Override
public void onClick(View view)
{
switch (view.getId())
{
//handle multiple view click events
}
}
}
我喜欢实现它的方式是在 Activity-Subclass 内部创建一个私有类,并让该内部类实现 OnClickListener:
public class ActivityMain extends Activity implements View.OnClickListener
{
private class ClickListener implements View.OnClickListener
{
@Override
public void onClick(View view)
{
switch (view.getId())
{
//handle multiple view click events
}
}
}
}
这样代码看起来更有条理,也更容易维护。
此外,谈到“Is-a”、“Has-a”关系,后者似乎是一个很好的做法,因为现在 Activity-Subclass 将与 ClickListener 具有“Has-a”关系。 而在前一种方法中,我们会说我们的 Activity-Subclass “Is-a” ClickListener,这并不完全正确。
请注意,我不关心后者会导致的内存开销。
另外,在xml中添加onClick标签是完全没有问题的。
那么,真正实现 ClickListener 的最佳方式是什么?
请不要推荐任何库,如 RoboGuice 或 ButterKnife 等。
更新:
我想分享一下我最终采用的方法。
我直接在Activity/Fragment中实现监听器。
就 OOP 设计而言。 “HAS-A” 方法没有提供任何实际好处,甚至会占用更多内存。考虑到我们将为我们实现的每个类似侦听器创建的嵌套类的数量(以及内存开销),显然应该避免这种方法。
【问题讨论】:
-
您的问题非常主观,您所说的“最佳”是什么意思。你的目标/目的是什么?
-
目标很简单,遵循最佳实践:)
-
你的
ClickListener是一个内部非静态类,这个'has-a' 的耦合与你的类Activity实现View.OnClickListener没有什么不同。这是因为您的内部ClickListener需要ActivityMain的实例,并且确实无法重用。我会争辩说你已经过度设计并且实际上并没有获得任何东西。 -
@CharlesDurham 这个特殊案例不是关于代码重用,而是关于更好的 OO 和易于维护......
-
说“has-a”比“is-a”更好并不重要。重要的是为什么软件开发人员更喜欢“有-a”关系而不是“是-a”。在这种情况下,您的抽象不会从使用组合而不是继承中获得任何通常的好处。
标签: java android listener onclicklistener implements