你的位置:首页 > 操作系统

[操作系统]Kotlin入门Application单例化

Kotlin入门(28)Application单例化 - aqi00的博客 - CSDN博客

下面是手工单例化的Kotlin代码例子: class MainApplication : Application() {     override fun onCreate() {         super.onCreate() ...

Android Kotlin Application单例化 实例(自定义Delegat..._CSDN博客

Android Studio Kotlin Application单例化 实例 第一种,是按照我们以前实现的单例模式 class FlashLight : Application() { panion object { // 按...

Kotlin与Android碰撞之美,其一,优雅的Application(单例模式) - 简书

原创文章,转载中注明转载地址:https://.jianshu./p/1fdae52a7d8e Java单例模式 回顾一下我们在Java中定义一个 “单例” Application 那我们在Ko...

Kotlin对象:仅一行代码就可创建安全的单例 - figozhg - 博客园

如你所见,创建一个有效的单例,你需要好几行代码。那么在Kotlin中是怎样的?...1 class App : Application() { 2 panion object { 3 lateinit var ...

【Kotlin】九、Application单例化和属性的Delegated - 简书

重新实现Application单例化 在这个情景下,委托就可以帮助我们了。我们直到我们的单...Kotlin 快速入门 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! ...

kotlin入门-object(单例) - jeffrey_feng2018的博客 - CSDN博客

1、kotlin 单例 class App : Application(){ panion object { private .....kotlin入门-柯里化函数调用链 linsir007:[code=plain] fun lt;P1gt; Funct...

从零开始的Kotlin for Android 学习笔记2-从Kotlin中的单例说起

作为一个单例来使用,但由于Android框架实例化类的...class MyKotlinApp : Application() { panion object...Kotlin 快速入门 前言 人生苦多,快来 ...

Kotlin入门第一课:从对比Java开始 - 路上的脚印 - 博客园

下面再给出Android中Application类单例化代码,就不做解释了。 1 class App : ...算是对Kotlin的一个入门,之后会比较系统地学习,并结合Android项目来进...

Kotlin中的5种单例模式示例详解_脚本之家

这篇文章主要给大家介绍了关于Kotlin中5种单例模式的相关资料,分别包括了饿汉式、懒汉式 、线程安全的懒汉式 、双重校验锁式以及静态内部类式,文中通...

Java到Kotlin,从入门到放弃

因为kotlin中只有对象。我们可以把它看作是已经实例化为单例的匿名内部类。实际...SpringApplication.run(AppRunner::class.java, *args) } } } ...

kotlin单例 - huajunoo的专栏 - CSDN博客

文章会不停修改和完善。 1、kotlin 单例 class App : Application(){ panion object { private var instance: Application? = null //var btDev: B...

Kotlin 设计模式解析之单例-博客-云栖社区-阿里云

作为一个刚入门不久的 Kotlin 菜鸟,可以比较明确的...实例化,从而破坏原有的单例模式,当然在 Kotlin 当...经常会需要持有一个全局 Application Contex...

kotlin从零基础到进阶第40集-40_kotlin面向对象-单例模式..._爱奇艺

《kotlin从零基础到进阶》第40集40_kotlin面向对象-单例模式,教育高清视频在线观看。40_kotlin面向对象-单例模式节目简介:本套教程为传智播客旗下高端...

Kotlin下的5种单例模式 - 相思雨的博客 - CSDN博客

上述代码中,我们可以发现在Kotlin实现中,我们让其主构造函数私有化并自定义了其...Kotlin.jpg 前言最近在学习Kotlin这门语言,在项目开发中,运用到了单...

Kotlin 入门-基本语法 - 花不掉泪的博客 - CSDN博客

Kotlin 入门-基本语法 kotlin 作为 java 类似的语言,学过 java 的同学,学 kotlin...Kotlin中的关键字(1) 05-27 4771 object 用于创建单例模式实例:object Re...

Kotlin最佳实践 - 怪谈时间到了 - 简书

的知识点,方便后续想要一起学习的同学们快速入门与...开发过程中会遇到单例模式的编写,基本的kotlin编写如...class App : Application() { panion ...

从零开始学 Kotlin 之「2」数据类型 - Binguenr - SegmentFault ...

可以看到 Unit 是用 object 定义的单例类型,调用它的 toString() 方法,只会返回 「Kotlin.Unit」。 并且Unit 的返回类型会返回 Unit 类型!!! fun test(){}...

Application单例化和属性的Delegated ·《Kotlin for android ...

Kotlin Android Extensions 怎么去使用Kotlin Android Extensions 重构我们的代码 Application单例化和属性的Delegated Applicaton单例化 委托属性 标准委托 怎么...

请教Kotlin如何写单例模式? - 知乎

我也刚刚接触kotlin 关于单例,这个视频讲的非常的详细。 腾讯播客 希望有帮助...class App : Application() { panion object { private var insta...

Kotlin入门 - 为什么使用Kotlin

容易学习 :Kotlin 语法很简单,和主流语言类似,语法高效,入门非常容易。好比当初...下面再给出Android中Application类单例化代码,就不做解释了。 class...奢侈度假排行榜: 探秘世界十大私人岛屿[一十十]那些藏在新加坡酒店中的奢华餐厅[二]清远牛鱼嘴风景区官网?牛鱼嘴户外嘉年华报名费多少钱?牛鱼嘴露营需要准备什么?清远牛鱼嘴露营攻略?清远户外嘉年华活动时间表?清远户外嘉年华有什么好玩的活动?2017牛鱼嘴中秋节活动?清远牛鱼嘴中秋节有哪些好玩的活动?北京长城饭店 北京长城饭店 北京长城饭店 北京长城饭店 北京长城饭店 北京长城饭店 北京长城攻略 北京长城攻略 北京长城攻略 北京长城攻略 北京长城攻略 北京长城攻略 北京长城国际旅行社 北京长城国际旅行社 北京长城国际旅行社 北京长城国际旅行社 北京长城国际旅行社 北京长城国际旅行社 北京长城介绍 北京长城介绍 北京长城介绍 北京长城介绍 北京长城介绍 北京长城介绍

Application是Android的又一大组件,在App运行过程中,有且仅有一个Application对象贯穿应用的整个生命周期,所以适合在Application中保存应用运行时的全局变量。而开展该工作的基础,是必须获得Application对象的唯一实例,也就是将Application单例化。获取一个类的单例对象,需要运用程序设计中常见的单例模式,倘若通过Java编码实现单例化,想必早已是大家耳熟能详的了。下面便是个Application单例化的Java代码例子:

public class MainApplication extends Application { private static MainApplication mApp;  public static MainApplication getInstance() {  return mApp; } @Override public void onCreate() {  super.onCreate();  mApp = this; }}

从上可见这个单例模式的实现过程主要有三个步骤,说明如下:

1、在自定义的Application类内部声明一个该类的静态实例;
2、重写onCreate方法,把自身对象赋值给第一步声明的实例;
3、提供一个供外部调用的静态方法getInstance,该方法返回第一步声明的Application类实例;
不管是代码还是步骤,这个单例化的实现都还蛮简单的。同样的单例化过程通过Kotlin编码实现的话,静态属性和静态方法可利用伴生对象来实现,这样就形成了Kotlin单例化的第一种方式:手工声明属性的单例化,具体描述见下。


一、手工声明属性的单例化
该方式与Java的常见做法一致,也是手工声明自身类的静态实例,然后通过静态方法返回自身实例。与Java的不同之处在于:Kotlin引入了空安全机制,故而静态属性要声明为可空变量、然后获得实例时要在末尾加上双感叹号表示非空,当然也可事先将自身实例声明为延迟初始化属性。总之,两种声明手段都是为了确保一个目的,即Application类提供给外部访问的自身实例必须是非空的。
下面是手工单例化的Kotlin代码例子:

class MainApplication : Application() { override fun onCreate() {  super.onCreate()  instance = this } //单例化的第一种方式:声明一个简单的Application属性 companion object {  //情况一:声明可空的属性  private var instance: MainApplication? = null  fun instance() = instance!!  //情况二:声明延迟初始化属性  //private lateinit var instance: MainApplication  //fun instance() = instance }}

  

二、借助Delegates的委托属性单例化
第一种方式的单例化,虽然提供了两种属性的声明手段,但只是为了保证自身实例的非空性。如果仅仅是确保属性非空,其实Kotlin已经提供了一个系统工具进行自动校验,这个工具便是Delegates的notNull方法。该方法返回非空校验的行为,只要将指定属性的读写行为委托给这个非空校验行为,那么开发者就无需手工进行非空判断了。利用Delegates工具的属性代理功能,就构成了Kotlin的第二种单例化方式;有关委托属性和属性代理的介绍,可参见前面的博文《Kotlin入门(25)共享参数模板》。
下面是系统委托属性单例化的Kotlin代码例子:

class MainApplication : Application() { override fun onCreate() {  super.onCreate()  instance = this } //单例化的第二种方式:利用系统自带的Delegates生成委托属性 companion object {  private var instance: MainApplication by Delegates.notNull()  fun instance() = instance }}

第二种方式的委托属性单例化,在App代码中获取Application实例与第一种方式是一样的,都是调用“MainApplication.instance()”这个函数获得Application的自身实例。

三、自定义委托行为的单例化
前两种单例化都只完成了非空校验,还不是严格意义上的单例化。真正的单例化是有且仅有一次赋值操作,尽管前两种的单例化并未实现唯一赋值功能,但是在大多数场合已经够用了。可是作为孜孜不倦的开发者,务必要究根问底,到底能不能实现唯一赋值情况下的单例化。显然系统自带的Delegates工具没有提供大家期待的校验行为,于是开发者必须自己写一个能够校验赋值次数的行为类,目的是接管委托属性的读写行为。自定义接管行为的实现,前面的博文《Kotlin入门(25)共享参数模板》即已给出了Preference<T>的完整源码,其中关键是重写了读方法getValue和写方法setValue,因此在这里可借鉴Preference<T>完成自定义的委托行为编码。
下面是自定义委托行为的单例化代码:

class MainApplication : Application() { override fun onCreate() {  super.onCreate()  instance = this } //单例化的第三种方式:自定义一个非空且只能一次性赋值的委托属性 companion object {  private var instance: MainApplication by NotNullSingleValueVar()  fun instance() = instance } //定义一个属性管理类,进行非空和重复赋值的判断 private class NotNullSingleValueVar<T>() : ReadWriteProperty<Any?, T> {  private var value: T? = null  override fun getValue(thisRef: Any?, property: KProperty<*>): T {   return value ?: throw IllegalStateException("application not initialized")  }  override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {   this.value = if (this.value == null) value   else throw IllegalStateException("application already initialized")  } }}

由上述代码看到,自定义的委托行为在getValue方法中进行非空校验,在setValue方法中进行重复赋值的校验,从而按照要求接管了委托属性的读写行为。