Насколько я понимаю, большое преимущество ?.let{}
перед != null
заключается в том, что оно гарантирует, что изменяемое значение не будет изменено внутри блока.
Однако, в случае неизменяемой переменнойразница в производительности?
Например, у меня есть простой метод
private fun test() {
val x: String? = ""
if (x != null) {
print("test")
}
x?.let {
print("test")
}
}
Когда я вижу получающийся в результате байт-код Kotlin, кажется, что он имеет гораздо больше кода.
Для случая x! = Null:
LINENUMBER 8 L1
L2
LINENUMBER 9 L2
LDC "test"
ASTORE 2
L3
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 2
INVOKEVIRTUAL java/io/PrintStream.print (Ljava/lang/Object;)V
L4
L5
Для случая x? .Let {}:
LINENUMBER 12 L5
ALOAD 1
ASTORE 2
L6
L7
ALOAD 2
ASTORE 3
L8
ICONST_0
ISTORE 4
L9
LINENUMBER 13 L9
LDC "test"
ASTORE 5
L10
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 5
INVOKEVIRTUAL java/io/PrintStream.print (Ljava/lang/Object;)V
L11
L12
LINENUMBER 14 L12
L13
NOP
L14
LINENUMBER 12 L14
L15
NOP
L16
ЕслиЯ декомпилирую в java, тогда результирующий код кажется похожим с еще одной переменной, назначаемой для let (любопытно, что для переменной int установлено значение false)
For x! = Null:
String var2 = "test";
System.out.print(var2);
Forx? .let {}
int var4 = false;
String var5 = "test";
System.out.print(var5);
В конце мой вопрос: отличается ли производительность между let и !=
для неизменяемых переменных?