何时使用 "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();
}
}
}
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();
}
}
}