Skip to content

Latest commit

 

History

History
177 lines (132 loc) · 6.58 KB

03.Kotlin类的扩展.md

File metadata and controls

177 lines (132 loc) · 6.58 KB

目录介绍

  • 01.使用companion object
  • 02.通过闭包减少接口类
  • 03.object对象声明

好消息

  • 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢!
  • 链接地址:https://github.com/yangchong211/YCBlogs
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议或者问题,万事起于忽微,量变引起质变!

01.使用companion object

  • 当你的类包含太多的东西,你想把它们隔离到另外一个类,又不想使用类引用的方式,你就可以使用companion object。
    • companion object的好处是,外部类可以直接访问对象,不需要通过对象指针
    class AndroidDetailActivity : WebViewActivity() , AndroidCollectContract.View{
    
        //companion object的好处是,外部类可以直接访问对象,不需要通过对象指针
        companion object {
            const val INTENT_TAG_HOME_DATA = "homeData"
            const val INTENT_TAG_BOOLEAN_IS_COLLECT = "isCollect"
            const val INTENT_TAG_INT_ARTICLE_ID = "articleId"
            fun lunch(context: Activity?, homeData: HomeData, isCollect: Boolean, articleId: Int) {
                val intent = Intent(context, AndroidDetailActivity::class.java)
                intent.putExtra(INTENT_TAG_HOME_DATA, homeData)
                intent.putExtra(INTENT_TAG_BOOLEAN_IS_COLLECT, isCollect)
                intent.putExtra(INTENT_TAG_INT_ARTICLE_ID, articleId)
                context?.startActivity(intent)
            }
        }
    }
    
    
    //如何引用
    AndroidDetailActivity.lunch(activity, homeData, homeData.collect, homeData.id)
    
  • 静态属性、常量或者函数
    • 我们需要一个类里面有一些静态的属性、常量或者函数,我们可以使用伴随对象。这个对象被这个类的所有对象所共享,就像java中的静态属性或者方法。在类声明内部可以用companion关键字标记对象声明:
    class AndroidUtils{
        companion object {
            const val name = "yc"
            fun create(): AndroidUtils = AndroidUtils()
            fun getVersionCode(mContext: Context): Int {
                var versionCode = 0
                try {
                    //获取软件版本号,对应AndroidManifest.xml下android:versionCode
                    versionCode = mContext.packageManager.getPackageInfo(mContext.packageName, 0).versionCode
                } catch (e: PackageManager.NameNotFoundException) {
                    e.printStackTrace()
                }
                return versionCode
            }
        }
    }
    
    
    //伴随对象的成员可以通过类名做限定词直接使用:
    val create = AndroidUtils.create()
    val versionCode = AndroidUtils.getVersionCode(activity)
    LogUtils.e("Android$versionCode")
    

02.通过闭包减少接口类

  • 有些时候你不想使用定义新的接口去实现回调,那就可以考虑使用闭包。
    • 这样写代码,会显示非常简洁,也避免了创建大量的接口回调类。
      protected fun <T> submit(observable: Observable<JsonResult<T>>, block: (T) -> Unit) {
          addDisposable(observable.observeOn(AndroidSchedulers.mainThread())
                 .subscribe(
                         {
                             if(it != null && !it.error && it.results != null) {
                                 block(it.results)
                             }else if (it == null){
                                 KLog.d(TagObject.TAG_Release, "result is null")
                             }else {
                                 KLog.d(TagObject.TAG_Release, "res.error:" + it.error + ",res.results:" + it.results)
                             }
                         },
                         {
                             KLog.d(TagObject.TAG_Release, "error android Presenter" + it.message)
                         }
                 )
            )
      }
      
    • 如何调用
      submit(mModel.getData(page, type)){
         view.setData(it)
      }
      

03.object对象声明

  • 在Java中,单例的声明可能具有多种方式:如懒汉式、饿汉式、静态内部类、枚举等;
  • 在Kotlin中,单例模式的实现只需要一个 object 关键字即可;
    // Kt文件中的声明方式: object 关键字声明,其内部不允许声明构造方法
    object SingleObject {
        fun test() {
            //...
        }
    }
    // 调用方式:类名.方法名()
    class Main {
        fun test() {
            SingleObject.test() //在class文件中,会自动编译成SingleObject.INSTANCE.test();调用方式
        }
    }
    
    // ----------------源码和字节码分界线 ---------------
    //Kotlin文件编译后的class代码如下:
    public final class SingleObject {
       public static final SingleObject INSTANCE;
    
       public final void test() {
       }
    
       private SingleObject() {
          INSTANCE = (SingleObject)this;
       }
    
       static {
          new SingleObject();
       }
    }
    

关于其他内容介绍

01.关于博客汇总链接

02.关于我的博客