【问题标题】:Java/Android: anonymous local classes vs named classesJava/Android:匿名本地类与命名类
【发布时间】:2010-08-26 16:05:23
【问题描述】:

我想问一下使用匿名类与命名内部类的良好做法是什么?

我正在编写一个 Android 应用程序,其中包含许多 UI 元素(按钮、文本字段等)。对于他们中的许多人,我需要某种监听器,所以在应用程序的onCreate 中,我有一堆非常小的匿名类,例如:

someButton.setOnClickListener(
    new View.OnClickListener() {
        public void onClick(View v) {
            // do something...
        }
    }
);

每个这样的匿名类都有 5 到 20 行大 - 足够小,非常适合 Java™ in a Nutshell 书中的推荐:

一般来说,如果出现以下情况,您应该考虑使用匿名类而不是本地类:

  • 类的主体很短。
  • 只需要一个类的实例。
  • 类在定义后立即使用。
  • 类的名称不会使您的代码更容易理解。

但问题是,IMO,onCreate 变得相当大,并且通过快速查看代码变得更复杂,难以阅读和理解。它仍然很容易理解,但是太大了。

那么在这种情况下有什么更好的做法 - 有一堆小的内部子类,每个子类都很好地分开,但只使用一次或更好地继续使用匿名类?

【问题讨论】:

  • 我的经验:继续使用匿名类,但尝试将部分代码移动到一个(或多个)私有方法并从 onCreate 方法调用它(它们)。

标签: java android subclass anonymous-class


【解决方案1】:

我不认为有一个明确的答案。两种风格都很好,它真的正是你喜欢的。

另一种选择是拥有

每个 onClick 的内容由单个函数调用,这将使匿名类非常短。即:

someButton.setOnClickListener(
    new View.OnClickListener() {
        public void onClick(View v) {
            doSomeButtonClick();
        }
    }
);


private void doSomeButtonClick() {
  // do something
}

【讨论】:

    【解决方案2】:

    onCreate() 重构为按通用功能分组的单独方法,以便您拥有逻辑单元。如果 GUI 很复杂,那么稍后会为您提供帮助。

    编辑:

    此外,由于默认情况下,在匿名类中,代码格式化程序会更多地缩进,因此您的行需要更短,以避免格式化程序将其中断多行,从而使其更长。这通常表明现在是提取类并为其命名的好时机。

    【讨论】:

      【解决方案3】:

      我做桌面/Swing 应用程序,但我认为概念是相同的。

      我更喜欢在一个类中处理所有事件,因此我创建了一个 Controller 类并在该类中实现我需要的所有侦听器。然后,我在面板上为每种类型的侦听器创建一个方法。它将侦听器添加到面板中需要侦听的每个组件。我将面板作为第一个参数传递给 Controller 类的构造函数,并让它调用面板上的每个添加侦听器方法。然后我在实例化面板时实例化控制器。

      这给了我几个好处:

      • 所有事件处理代码都在一个类中。
      • 事件之间的任何功能交叉都很容易被捕获和处理。
      • 任何受影响的状态都可以在一个类中存储和控制。
      • 所有事件处理代码都与组件布局代码分开。
      • View 层(Panel)对 Controller 层一无所知。

      话虽如此,如果你要连接的事件都做简单的事情,并且这些事情不与其他事件发生冲突,那么使用匿名类并没有错。

      【讨论】:

      • 这是你正在使用的很棒的技术。我认为,当 UI 组件之间有很多交互时,它非常有用。虽然 Mayra 的建议可能更适合我的需求,但仍然 - 非常好的主意。我会记住它以备将来使用,谢谢!
      【解决方案4】:

      我不知道社区是否认为它是最佳实践,但是当这种类变得太大时,我会创建一个包侦听器并在其中创建我的类。如果内部类或匿名类在您的代码中妨碍您,为什么还要使用它。

      但大多数时候,如果这种类变得很大,那是因为你没有足够的委派。也许其他类应该有一些方法来帮助你的听众变得更轻。

      【讨论】:

        【解决方案5】:

        正如引用所暗示的,这是主观的。您需要弄清楚什么对自己来说是“非常短”和“更容易理解”,以确定代码大小在什么时候越过界限,从作为匿名类有意义的东西变成有意义的自己的东西单元。

        任何人对此给出的答案都是基于他们自己对“短”是什么以及不再“短”需要多少行代码的主观衡量。

        【讨论】:

          【解决方案6】:

          将这些项目放在命名类中有几个优点。

          第一个就是你提到的——它会让 onCreate() 方法更加简洁易懂。

          第二个是名字要能快速识别出哪个逻辑跟哪个按钮走,这样会让代码清零

          第三个是更容易的职责分离。如果您决定使用 IoC 模型,您将更容易注入侦听器的命名实现。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多