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

时间:2010-08-26 16:05:24

标签: java android subclass anonymous-class

我想问一下使用匿名类和命名内部类的好习惯是什么?

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

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

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

  

通常,在下列情况下,您应该考虑使用匿名类而不是本地类:

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

但问题是IMO,onCreate变得非常大,通过快速查看,代码变得更加复杂。它仍然很容易理解,但是太大了。

那么在这种情况下会有什么更好的练习 - 有一堆小的内部子类,其中每个子类很好地分开,但只使用一次或更好的代码而不是继续使用匿名类?

6 个答案:

答案 0 :(得分:8)

我不认为这种或那种方式有明确的答案。两种风格都很好,它真的是你喜欢的。

另一种选择是

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

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


private void doSomeButtonClick() {
  // do something
}

答案 1 :(得分:5)

onCreate()重构为按公共功能分组的单独方法,以便您拥有逻辑单元。如果GUI很复杂,那么它将在以后帮助你。

修改

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

答案 2 :(得分:3)

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

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

这给了我几个好处:

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

话虽如此,如果你所挂钩的事件都做了简单的事情,并且这些事情与其他事件没有冲突,那么使用匿名类就没有错。

答案 3 :(得分:1)

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

但是大部分时间,如果这种类变大,那是因为你没有足够的委托。也许其他类应该有一些方法可以帮助你的听众变轻。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

将这些项目放在命名类中有几个好处。

第一个是你提到的那个 - 它会使onCreate()方法更简洁和易懂。

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

第三是更容易分离职责。如果您决定使用IoC模型,则可以更轻松地注入监听器的命名实现。