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

Lai*_*jus 8 java android subclass anonymous-class

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

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

someButton.setOnClickListener(
    new View.OnClickListener() {
        public void onClick(View v) {
            // do something...
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Che*_*mon 8

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

另一种选择是拥有

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

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


private void doSomeButtonClick() {
  // do something
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*sen 5

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

编辑:

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