在实现一个有多个方法的接口时,需要把所有方法进行实现,即使不需要实现该方法,也需要空实现。
例如实现Activity
生命周期的回调:
registerActivityLifecycleCallbacks(object :ActivityLifecycleCallbacks{
override fun onActivityPaused(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivityStarted(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivityDestroyed(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
TODO("Not yet implemented")
}
override fun onActivityStopped(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
TODO("Not yet implemented")
}
override fun onActivityResumed(activity: Activity) {
TODO("Not yet implemented")
}
})
Kotlin提供了委托机制,可以将接口实现委托给方法进行实现。
实现委托方法:
inline fun<reified T: Any> noOpDelegate() :T{
val javaClass = T::class.java
val noDelegate = InvocationHandler { _, _, _-> }
return Proxy.newProxyInstance(javaClass.classLoader, arrayOf(javaClass), noDelegate) as T
}
在调用处用委托处理:
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks by noOpDelegate(){
override fun onActivityDestroyed(activity: Activity) {
Log.d(TAG, "onActivityDestroyed")
}
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
Log.d(TAG, "onActivityDestroyed")
}
})
这里可以自由选择需要实现的方法,而不需要重写所有接口方法。
通过KotlinByteCode可以查看对应的Java实现:
registerActivityLifecycleCallbacks((ActivityLifecycleCallbacks)(new ActivityLifecycleCallbacks() {
// $FF: synthetic field
private final ActivityLifecycleCallbacks $$delegate_0;
public void onActivityDestroyed(@NotNull Activity activity) {
Intrinsics.checkParameterIsNotNull(activity, "activity");
Log.d("AppApplication", "onActivityDestroyed");
}
public void onActivityCreated(@NotNull Activity activity, @Nullable Bundle savedInstanceState) {
Intrinsics.checkParameterIsNotNull(activity, "activity");
Log.d("AppApplication", "onActivityDestroyed");
}
{
int $i$f$noOpDelegate = false;
Class javaClass$iv = ActivityLifecycleCallbacks.class;
InvocationHandler noDelegate$iv = (InvocationHandler)DelegateExtKt$noOpDelegate$noDelegate$1.INSTANCE;
Object var10000 = Proxy.newProxyInstance(javaClass$iv.getClassLoader(), new Class[]{javaClass$iv}, noDelegate$iv);
if (var10000 == null) {
throw new TypeCastException("null cannot be cast to non-null type android.app.Application.ActivityLifecycleCallbacks");
} else {
ActivityLifecycleCallbacks var5 = (ActivityLifecycleCallbacks)var10000;
this.$$delegate_0 = var5;
}
}
public void onActivityPaused(@RecentlyNonNull Activity activity) {
this.$$delegate_0.onActivityPaused(activity);
}
public void onActivityResumed(@RecentlyNonNull Activity activity) {
this.$$delegate_0.onActivityResumed(activity);
}
public void onActivitySaveInstanceState(@RecentlyNonNull Activity activity, @RecentlyNonNull Bundle outState) {
this.$$delegate_0.onActivitySaveInstanceState(activity, outState);
}
public void onActivityStarted(@RecentlyNonNull Activity activity) {
this.$$delegate_0.onActivityStarted(activity);
}
public void onActivityStopped(@RecentlyNonNull Activity activity) {
this.$$delegate_0.onActivityStopped(activity);
}
}));
实现也很简单,通过委托,在匿名类里面用动态代理生成了委托类delegate_0
,该类实现接口所有默认实现。
通过这种方式,可以极大减少没有必要实现的接口方法。
作者:叶子的追随
链接:https://www.jianshu.com/p/bc7ef8136f84
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。