Kotlin阵列初始化中的初始化调用顺序

Jan*_*ani 3 arrays init kotlin

在数组的构造函数中,是否可以保证索引的递增顺序将调用init函数?

这是有道理的,但我在文档中找不到任何此类信息:https : //kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/-init-.html#kotlin.Array%24%28kotlin .Int%2C + kotlin.Function1%28%28kotlin.Int%2C + kotlin.Array.T%29%29%29%2Finit

leo*_*mer 6

API中对此不做任何保证。

TLDR:如果需要顺序执行,因为您有某种状态需要更改,请参见底部。

首先让我们看一下初始化程序的实现:

本机:Kotlin本机升序实现。

@InlineConstructor
public constructor(size: Int, init: (Int) -> Char): this(size) {
    for (i in 0..size - 1) {
        this[i] = init(i)
    }
}
Run Code Online (Sandbox Code Playgroud)

JVM:反编译Kotlin字节码

class test {
    val intArray = IntArray(100) { it * 2 }
}
Run Code Online (Sandbox Code Playgroud)

在Android Studio中使用Java产生:

public final class test {
   @NotNull
   private final int[] intArray;

   @NotNull
   public final int[] getIntArray() {
      return this.intArray;
   }

   public test() {
      int size$iv = 100;
      int[] result$iv = new int[size$iv];
      int i$iv = 0;

      for(int var4 = result$iv.length; i$iv < var4; ++i$iv) {
         int var6 = false;
         int var11 = i$iv * 2;
         result$iv[i$iv] = var11;
      }

      this.intArray = result$iv;
   }
}
Run Code Online (Sandbox Code Playgroud)

它支持声称它是按升序初始化的。

结论:它通常实现为按升序执行。

但是:您不能依赖执行顺序,因为API不能保证实现。它可能会发生变化,并且对于不同的平台它可能会有所不同(尽管两者均不太可能)。

解决方案:您可以手动循环初始化数组,然后可以控制执行顺序。下面的示例概述了一个可能的实现,该实现具有稳定的,具有随机值的初始化,例如用于测试。

val intArray = IntArray(100).also {
    val random = Random(0)
    for (index in it.indices) {
        it[index] = index * random.nextInt()
    }
}
Run Code Online (Sandbox Code Playgroud)