《在飞Android Kotlin实战》之单例设计模式、类型转换、类型判断、by lazy、lateinit加载及原理分析篇5

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的内部构造函数。

扫描二维码关注公众号,回复: 9144725 查看本文章

     (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语言,希望我的博客对你有帮助!

相关源码

发布了71 篇原创文章 · 获赞 15 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/pangzaifei/article/details/85163500
今日推荐