Kotlin通过委托实现接口默认方法

在实现一个有多个方法的接口时,需要把所有方法进行实现,即使不需要实现该方法,也需要空实现。
例如实现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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值