如何提高kotlin代码质量

2018-08-28  本文已影响0人  Snail127
                                  编程是一门艺术,程序员是艺术家,其他人是码农!

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

上一篇下一篇

猜你喜欢

热点阅读