- 01.使用companion object
- 02.通过闭包减少接口类
- 03.object对象声明
- 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢!
- 链接地址:https://github.com/yangchong211/YCBlogs
- 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议或者问题,万事起于忽微,量变引起质变!
- 当你的类包含太多的东西,你想把它们隔离到另外一个类,又不想使用类引用的方式,你就可以使用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")
- 有些时候你不想使用定义新的接口去实现回调,那就可以考虑使用闭包。
- 这样写代码,会显示非常简洁,也避免了创建大量的接口回调类。
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) }
- 这样写代码,会显示非常简洁,也避免了创建大量的接口回调类。
- 在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(); } }
- github:https://github.com/yangchong211
- 知乎:https://www.zhihu.com/people/yczbj/activities
- 简书:http://www.jianshu.com/u/b7b2c6ed9284
- csdn:http://my.csdn.net/m0_37700275
- 喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/
- 开源中国:https://my.oschina.net/zbj1618/blog
- 泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
- 邮箱:yangchong211@163.com
- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
- segmentfault头条:https://segmentfault.com/u/xiangjianyu/articles
- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e