代码之家  ›  专栏  ›  技术社区  ›  Laimoncijus

Java/Android:匿名本地类与命名类

  •  8
  • Laimoncijus  · 技术社区  · 15 年前

    我正在编写一个Android应用程序,它包含许多UI元素(按钮、文本字段等)。对他们中的许多人来说,我需要一些倾听者,所以 onCreate

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

    每一个这样的匿名类都有5-20行,足够大,足够小,适合来自 Java技术手册 书:

    • 这个班的学生身材很矮。
    • 只需要类的一个实例。
    • 类的名称不会使代码更容易理解。

    但问题是,国际海事组织 创建时的回调函数 通过快速查看代码,代码变得非常大,阅读和理解变得更加复杂。它仍然很容易理解,只是太大了。

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

    6 回复  |  直到 15 年前
        1
  •  8
  •   Cheryl Simon    15 年前

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

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

    someButton.setOnClickListener(
        new View.OnClickListener() {
            public void onClick(View v) {
                doSomeButtonClick();
            }
        }
    );
    
    
    private void doSomeButtonClick() {
      // do something
    }
    
        2
  •  5
  •   naXa stands with Ukraine    12 年前

    onCreate() 按公共功能分组到不同的方法中,这样就有了逻辑单元。如果GUI很复杂,那么它以后会对您有所帮助。

    编辑:

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

        3
  •  3
  •   Erick Robertson    15 年前

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

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

    这给了我几个好处:

    • 所有事件处理代码都在一个类中。
    • 所有事件处理代码都与组件布局代码分开。
    • 视图层(面板)对控制器层一无所知。

        4
  •  1
  •   Colin Hebert    15 年前

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

        5
  •  0
  •   matt b    15 年前

    正如引文所说,这是主观的。你需要弄清楚什么对你自己来说是“非常短”和“更容易理解”的,以确定在什么时候代码大小会从作为匿名类有意义的东西跨越到作为它自己的单元有意义的东西。

        6
  •  0
  •   Matthew Flynn    15 年前

    第一个是您提到的——它将使onCreate()方法更加简洁易懂。

    第二个是名称应该快速识别哪个逻辑与哪个按钮相匹配,这将清除代码

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