匿名内部类(非匿名内部类)的优点是什么?

时间:2011-02-28 22:13:08

标签: java anonymous-types inner-classes

考虑这个(匿名):

speakBtn.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
    }});

VS。这:(非匿名):

class MyOuterClass {
    private class MyOnClickListener implements OnClickListener {
        @Override
        public void onClick(View view) {
            mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
        }
    }

    // later (inside some method)...
        speakBtn.setOnClickListener(new MyOnClickListener());
}

除了行数较少外,匿名表格还有其他优势吗?

是否有性能优势?

6 个答案:

答案 0 :(得分:4)

匿名内部类优于内部类(如问题示例代码中),因为它会关闭方法的局部变量(尽管只有final个本地可用)。

通常,内部类可以很容易地转换为具有匿名内部类的方法,这有助于减少冗长。如果你有一个非常大的内部类,你想让它成为非本地的,你可能想要考虑与你的IDE争夺,把它作为外部类放在一个新文件中。

(也是本地类,它是在方法中定义的普通命名内部类,并且关闭本地类。)

答案 1 :(得分:2)

非匿名的优点是您可以重用该类。我相信使用匿名内部类的唯一原因是简洁。

答案 2 :(得分:2)

我喜欢命名的内部类:

  • 他们有一个名字。当我在堆栈跟踪中看到MyOuterClass$MyOnClickListener而不是MyOuterClass$1时,我发现调试更容易,这就是你使用匿名内部类获得的。
  • 有时可以帮助您将内部类的实际代码与您正在使用它的地方分开。我特别喜欢这个,如果我已经使用了很长的方法或缩进了一两个级别。

为了评论你关于性能的观点,匿名内部类被编译成普通类,所以应该没有性能差异。

答案 3 :(得分:1)

优点是您作为开发人员保存的时间不必键入额外的击键。 :)

哦,它还可以防止您不必为所有事情提出新名称(在某些情况下可能会导致名称冲突)。

答案 4 :(得分:1)

突然出现一个缺点:

如果您需要多个相同的内部类,则几乎需要使用明确定义的类。对于你所描述的,不,你不需要一个。但是您可能会在以后决定需要另一个具有相同功能的对象,但它是一个不同的对象。

答案 5 :(得分:0)

匿名类的目的是使您所需的类成为本地类。当我们非常确定特定的A类是B类的唯一消费者而没有其他地方可以使用这个B类时,使用匿名类。然后我们更好地将类B定义为命名类A中的匿名类。正在同一个类中编写所需的逻辑,以避免从外部创建对象。它在代码可维护性方面很容易维护。因此,匿名类使您可以使代码更简洁。它们使您能够同时声明和实例化一个类。他们就像当地的班级,除了他们没有名字。如果您只需要使用本地类一次,请使用它们。