志在指尖
用双手敲打未来

Application单例化

Application是Android的又一大组件,在App运行进程中,有且仅有一个Application目标贯穿使用的整个生命周期,所以适合在Application中保存使用运行时的全局变量。而开展该作业的基础,是有必要取得Application目标的仅有实例,也就是将Application单例化。获取一个类的单例目标,需求运用程序设计中常见的单例形式,倘若经过Java编码完成单例化,想必早已是大家耳熟能详的了。下面就是个Application单例化的Java代码比如:
publicclassMainApplicationextendsApplication{
privatestaticMainApplicationmApp;
publicstaticMainApplicationgetInstance(){
returnmApp;
}
@Override
publicvoidonCreate(){
super.onCreate();
mApp=this;
}
}
从上可见这个单例形式的完成进程主要有三个进程,说明如下:
1、在自界说的Application类内部声明一个该类的静态实例;
2、重写onCreate办法,把本身目标赋值给第一步声明的实例;
3、供给一个供外部调用的静态办法getInstance,该办法回来第一步声明的Application类实例;Android
不管是代码仍是进程,这个单例化的完成都还蛮简略的。相同的单例化进程经过Kotlin编码完成的话,静态特点和静态办法可使用伴生目标来完成,这样就形成了Kotlin单例化的第一种办法:手艺声明特点的单例化,详细描述见下。
一、手艺声明特点的单例化
该办法与Java的常见做法共同,也是手艺声明本身类的静态实例,然后经过静态办法回来本身实例。与Java的不同之处在于:Kotlin引入了空安全机制,故而静态特点要声明为可空变量、然后取得实例时要在末尾加上双感叹号表明非空,当然也可事先将本身实例声明为推迟初始化特点。总归,两种声明手法都是为了保证一个目的,即Application类供给给外部访问的本身实例有必要是非空的。
下面是手艺单例化的Kotlin代码比如:
classMainApplication:Application(){
overridefunonCreate(){
super.onCreate()
instance=this
}
//单例化的第一种办法:声明一个简略的Application特点
companionobject{
//状况一:声明可空的特点
privatevarinstance:MainApplication?=null
funinstance()=instance!!
//状况二:声明推迟初始化特点
//privatelateinitvarinstance:MainApplication
//funinstance()=instance
}
}
二、凭借Delegates的托付特点单例化
第一种办法的单例化,虽然供给了两种特点的声明手法,但只是为了保证本身实例的非空性。如果仅仅是保证特点非空,其实Kotlin现已供给了一个体系东西进行自动校验,这个东西就是Delegates的notNull办法。该办法回来非空校验的行为,只要将指定特点的读写行为托付给这个非空校验行为,那么开发者就无需手艺进行非空判别了。使用Delegates东西的特点署理功用,就构成了Kotlin的第二种单例化办法;有关托付特点和特点署理的介绍,可拜见前面的博文《Kotlin入门(25)同享参数模板》。
下面是体系托付特点单例化的Kotlin代码比如:
classMainApplication:Application(){
overridefunonCreate(){
super.onCreate()
instance=this
}
//单例化的第二种办法:使用体系自带的Delegates生成托付特点
companionobject{
privatevarinstance:MainApplicationbyDelegates.notNull()
funinstance()=instance
}
}
第二种办法的托付特点单例化,在App代码中获取Application实例与第一种办法是相同的,都是调用“MainApplication.instance()”这个函数取得Application的本身实例。
三、自界说托付行为的单例化
前两种单例化都只完成了非空校验,还不是严厉意义上的单例化。真正的单例化是有且仅有一次赋值操作,虽然前两种的单例化并未完成仅有赋值功用,但是在大多数场合现已够用了。可是作为孜孜不倦的开发者,务必要究根问底,究竟能不能完成仅有赋值状况下的单例化。显然体系自带的Delegates东西没有供给大家等待的校验行为,所以开发者有必要自己写一个能够校验赋值次数的行为类,目的是接管托付特点的读写行为。自界说接管行为的完成,前面的博文《Kotlin入门(25)同享参数模板》即已给出了Preference的完好源码,其间关键是重写了读办法getValue和写办法setValue,因而在这里可学习Preference完成自界说的托付行为编码。
下面是自界说托付行为的单例化代码:
classMainApplication:Application(){
overridefunonCreate(){
super.onCreate()
instance=this
}
//单例化的第三种办法:自界说一个非空且只能一次性赋值的托付特点
companionobject{
privatevarinstance:MainApplicationbyNotNullSingleValueVar()
funinstance()=instance
}
//界说一个特点管理类,进行非空和重复赋值的判别
privateclassNotNullSingleValueVar():ReadWriteProperty{
privatevarvalue:T?=null
overridefungetValue(thisRef:Any?,property:KProperty<*>):T{
returnvalue?:throwIllegalStateException(“applicationnotinitialized”)
}
overridefunsetValue(thisRef:Any?,property:KProperty<*>,value:T){
this.value=if(this.value==null)value
elsethrowIllegalStateException(“applicationalreadyinitialized”)
}
}
}
由上述代码看到,自界说的托付行为在getValue办法中进行非空校验,在setValue办法中进行重复赋值的校验,从而依照要求接管了托付特点的读写行为。

未经允许不得转载:IT技术网站 » Application单例化
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载