何时使用 "Convert Anonymous to Inner" 进行重构?

When to use refactoring with "Convert Anonymous to Inner"?

Android Studio 提供了很好的重构项。 但是"convert anonymous to inner"什么时候做比较好呢?

例如:

        new Thread(new Runnable() {
            @Override
            public void run() {
                // do something
            }
        })

重构后:

         new Thread(new MyRunnable());

         private static class MyRunnable implements Runnable {
             @Override
             public void run() {
                 // do something
             }
         }

创建内部 class 的多个实例(通过调用其构造函数)比创建匿名 class 的多个实例要容易得多。

一个更容易回答的问题是How are Anonymous (inner) classes used in Java?,简而言之就是快速实现一个接口(或抽象class)而不向接口(或抽象[=25]添加太多功能=]) 与想要另一个 class 的强类型子 class 相比,后者将定期构建。

interfaces/abstract class你通常想使用匿名内部 class 的一个很好的例子是 Runnables 和大多数 Listener 接口,因为它们只用作一段代码 "given" 到另一个 class 的实例。内部 classes 的好例子是 android 中的片段或自定义控件(android 中的视图),尽管将它们重构为单独的 classes 可以使它们更易于重用。

一个快速而肮脏的测试是 "Do I need create my own constructor for my inner class?",如果答案是 "yes",则使用非匿名内部 class。

据我所知,您应该使用静态方法来避免 Memory Leak。例如:

new Thread(new Runnable() {
        @Override
        public void run() {
            // do something long here
            YourActivity.this.doSomething();
        }
    })

--> 当线程为 运行 时关闭你的应用程序时,上面的代码将使你的应用程序出现内存泄漏错误。 但是,通过新的重构,您可以轻松避免内存泄漏:

 private static class MyRunnable implements Runnable {
         WeakReference<YourActivity> activity;
         @Override
         public void run() {
             // do something long
              if(activity.get() != null){
                  activity.get().doSomething();             
              }
         }
     }