hi各位亲,这篇主要说下Kotlin中的强转、类型判断、单例设计模式、by lazy、lateinit
一:强转
在android开发中经常会用到强转,比如findviewById()中
//java强转
TextView titleView = (TextView) rl.findViewById(R.id.card_name);
//Kotlin强转
var titleView = rl.findViewById(R.id.card_name) as TextView
Kotlin是用 as 来强转的,java中是用()
二:类型判断
//java类型判断
if (titleView instanceof TextView) {}
//Kotlin强转
if(titleView is TextView){}
Kotlin是用 is 来判断类型的,java是用instanceof
三:单例设计模式
内存中只有一个对象实例
//java单例实现
public class DuInput {
private static DuInput mDuInput;
private Context mContext;
public static DuInput getInstance(Context context) {
if (mDuInput == null) {
synchronized (DuInput.class) {
if (mDuInput == null) {
mDuInput = new DuInput(context);
}
}
}
return mDuInput;
}
DuInput(Context context) {
this.mContext = context;
}
public void start() {
}
}
外部调用: DuInput.getInstance(InputActivity.this).start();
//Kotlin单例实现1
class DuInput internal constructor(private val mContext: Context) {
companion object {
private var mDuInput: DuInput? = null
fun getInstance(context: Context): DuInput {
if (mDuInput == null) {
synchronized(DuInput::class.java) {
if (mDuInput == null) {
mDuInput = DuInput(context)
}
}
}
return mDuInput!!
}
}
}
外部调用: DuInput.getInstance(this@KotlinList2).start()
//Kotlin单例实现2
object TestInstance {
fun start2() {}
}
外部调用: TestInstance.start2()
上面是用java和Kotlin分别实现单例,java实现我就不再赘述了。
Kotlin实现单例1解析:
class DuInput internal constructor() :类名叫DuInput 是internal内部的(这个位置有publick private protected internal这几个选择应该就好理解了) constructor是构造函数。所以就是一个叫DuInput的内部构造函数。
(private val mContext: Context):参数是私有化的mContext
companion object {}:这个叫伴生对象。Kotlin中object修饰的,里面的参数都是static的,所以使用companion object,里面可以让你需要的参数变成非final类型。举个例子如下:
//1.普通class的类testObject1及内部的普通参数testData
class testObject1{
var testData = 10
}
//1.生成的java中的testData
private int testData = 10;
//2.object修饰的类testObject2及内部object修饰的参数testData2
object testObject2{
var testObjectData2 = 10
}
//2.生成的java中的testData2
private static int testObjectData2;
解释:
private var mDuInput: DuInput? = null:创建一个private并且可空的mDuInput对象转载请注明出处:https://blog.csdn.net/pangzaifei/article/details/85163500
fun getInstance(context: Context): DuInput {} :定义getInstance方法,返回值是DuInput类型
Kotlin实现单例2解析:
使用object修饰类,可以达到单例效果,生成的java代码就一目了然了
//object生成的java代码
public final class TestInstance {
public static final TestInstance INSTANCE;
public final void start2() {
}
static {
TestInstance var0 = new TestInstance();
INSTANCE = var0;
}
}
四:by lazy与lateinit
//by lazy
val testByLazy by lazy {
0
}
//lateinit
lateinit var testLateInit: String//在这用lateinit会报错
by lazy和lateinit用起来很简单,主要说下区别:
1.by lazy:需要val来修饰,lateinit需要用var来修饰。
2. by lazy:返回值是lambda最后一行。
3.bylazy线程安全,lateinit线程不安全
4.bylazy是在你知道具体值的时候使用,用到的时候再加载。lateinit是不知道具体指,等用的时候去赋值
by lazy需要注意一点就是它初始化只有一次,例子如下:
https://blog.csdn.net/pangzaifei/article/details/85163500
结果:初始化bylazy..
testByLazy1:10
testByLazy2:10
Ps:我是在飞~~,只有空闲时间才能更新博客,所以本系列偏快速入门,主要讲实战中经常用到内容,让你快速上手。所以文章尽量简短,敬请谅解,本系列文章默认阅读者已经熟悉java语言,希望我的博客对你有帮助!