考虑这个(匿名):
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());
}
除了行数较少外,匿名表格还有其他优势吗?
是否有性能优势?
答案 0 :(得分:4)
匿名内部类优于内部类(如问题示例代码中),因为它会关闭方法的局部变量(尽管只有final
个本地可用)。
通常,内部类可以很容易地转换为具有匿名内部类的方法,这有助于减少冗长。如果你有一个非常大的内部类,你想让它成为非本地的,你可能想要考虑与你的IDE争夺,把它作为外部类放在一个新文件中。
(也是本地类,它是在方法中定义的普通命名内部类,并且关闭本地类。)
答案 1 :(得分:2)
非匿名的优点是您可以重用该类。我相信使用匿名内部类的唯一原因是简洁。
答案 2 :(得分:2)
我喜欢命名的内部类:
MyOuterClass$MyOnClickListener
而不是MyOuterClass$1
时,我发现调试更容易,这就是你使用匿名内部类获得的。为了评论你关于性能的观点,匿名内部类被编译成普通类,所以应该没有性能差异。
答案 3 :(得分:1)
优点是您作为开发人员保存的时间不必键入额外的击键。 :)
哦,它还可以防止您不必为所有事情提出新名称(在某些情况下可能会导致名称冲突)。
答案 4 :(得分:1)
突然出现一个缺点:
如果您需要多个相同的内部类,则几乎需要使用明确定义的类。对于你所描述的,不,你不需要一个。但是您可能会在以后决定需要另一个具有相同功能的对象,但它是一个不同的对象。
答案 5 :(得分:0)
匿名类的目的是使您所需的类成为本地类。当我们非常确定特定的A类是B类的唯一消费者而没有其他地方可以使用这个B类时,使用匿名类。然后我们更好地将类B定义为命名类A中的匿名类。正在同一个类中编写所需的逻辑,以避免从外部创建对象。它在代码可维护性方面很容易维护。因此,匿名类使您可以使代码更简洁。它们使您能够同时声明和实例化一个类。他们就像当地的班级,除了他们没有名字。如果您只需要使用本地类一次,请使用它们。