我知道在实现Listener和类似的东西时,匿名类可以保存输入.他们试图取代一些封闭用法.
但社区对这种语言特征的价值有何看法?它是否有意义并且您经常使用它吗?它是否使代码更清晰,更易理解,更易于维护?或者匿名类使代码可读性降低?
您对此有什么看法,请举例说明/支持您的意见吗?
我倾向于使用匿名内部类,在我不需要完成一个完整的类来执行某些任务的情况下.例如,如果我想实现一个ActionListener
或Runnable
,但我不认为有一个内部类是必要的.例如,对于开始一个简单的Thread
,使用匿名内部类可能更具可读性:
public void someMethod() { new Thread(new Runnable() { public void run() { // do stuff } }).start(); }
在某些情况下,例如上面的例子,它可以提高可读性,特别是对于一次性任务,因为要执行的代码全部写在一个地方.使用内部类会"代理"代码:
public void someMethod() { new Thread(new MyRunnable()).start(); } // ... several methods down ... // class MyRunnable implements Runnable { public void run() { // do stuff } }
也就是说,如果有可能会重复相同事情的情况,它确实应该是一个单独的类,无论是常规类还是内部类.
我倾向于在程序中使用匿名内部类,我只是尝试解决问题而不是将其作为实际应用程序的核心功能.
匿名内部类的另一个好用途是当你需要初始化像ArrayList和Set这样的集合时.这种做法也称为双支撑初始化 例如,
private static final SetVALID_CODES = new HashSet () {{ add("XZ13s"); add("AB21/X"); add("YYLEX"); add("AR2D"); }};
显然,这不仅限于收藏品; 它可以用来初始化任何类型的对象 - 例如Gui对象:
add(new JPanel() {{ setLayout(...); setBorder(...); add(new JLabel(...)); add(new JSpinner(...)); }});
我的观点是匿名类使代码的可读性降低.为了实现监听器,匿名类很有用.对于开发GWT应用程序,匿名类是更好的选择.对于这些情况,如果我们不使用匿名类,则代码行数将增加.
我们重新使用匿名类.我发现它们很容易用于实现只有一个或两个方法的接口,以及其他地方没有使用的功能.如果你在其他地方再次使用相同的功能,那么应该有一个真正的类可以重用.