美文网首页
如何提高kotlin代码质量

如何提高kotlin代码质量

作者: Snail127 | 来源:发表于2018-08-28 12:02 被阅读0次
                                      编程是一门艺术,程序员是艺术家,其他人是码农!
    

    1.Kotlin的隐藏开销

    伴生对象
    伴生对象通过在类中使用companion object来创建,用来替代静态成员,类似于Java中的静态内部类。所以在伴生对象中声明常量是很常见的做法,但如果写法不对,可能就会产生额外开销。

    2. For循环

    Kotlin提供了downTostepuntilreversed等函数来帮助开发者更简单的使用For循环,如果单一的使用这些函数确实是方便简洁又高效,但要是将其中两个结合呢?比如下面这样:

    fun show(){
        val i: Int = 10
        for (a in 100 downTo 10 step 10)
          println(i)
      }
    

    转换后的Java代码

    public void show() {
          int i = 10;
          IntProgression var10000 = RangesKt.step(RangesKt.downTo(100, 10), 10);
          int a = var10000.getFirst();
          int var3 = var10000.getLast();
          int var4 = var10000.getStep();
          if (var4 > 0) {
             if (a > var3) {
                return;
             }
          } else if (a < var3) {
             return;
          }
          while(true) {
             System.out.println(i);
             if (a == var3) {
                return;
             }
             a += var4;
          }
       }
    

    重点看这行代码:
    IntProgression var10000 = RangesKt.step(RangesKt.downTo(10, 1), 2);
    这行代码就创建了两个IntProgression临时对象,增加了额外的开销。

    3.基本类型数组

    在Kotlin中有3种数组类型:
    IntArrayFloatArray,其他:基本类型数组,被编译成int[]float[],其他
    Array<T>:非空对象数组
    Array<T?>:可空对象数组
    //kotlin 创建数组

    val a =intArrayOf(1)
    val b =arrayOf(1)
    val c =arrayOf(null)
    

    等价java创建数组

    @NotNull
    private final int [] a =int[]{1}
    @NotNull
    private final Integer [] b=new Integer[]{Integer.valueOf(1)}
    @NotNull
    private final Integer [] b=new Integer[]{(Integer)null}
    

    后面两种方法都对基本类型做了装箱处理,产生了额外的开销。
    所以当需要声明非空的基本类型数组时,应该使用xxxArray,避免自动装箱。

    ?.?:

          list.get(1).account
          println("-----------------------")
          list.add(User().also { it.mobile = "1111111" })
          //abc?.let   abc不为空调用,为空跳过
          list.get(3).account?.let {
            println(it)
          }
          list.get(3).mobile?.let {
            println(it)
          }
          //?: 前面不为空返回前面的值否则返回后面的值
          UserVo(id = user.id ?: 0, account = user.account ?: "")
    

    未完待续 - - -

    参考链接:https://tech.meituan.com/Kotlin_code_inspect.html

    相关文章

      网友评论

          本文标题:如何提高kotlin代码质量

          本文链接:https://www.haomeiwen.com/subject/tnefwftx.html