Tôi personaly giống như cú pháp when
vì nó khiến cho định danh rõ ràng hơn nhiều. Tuy nhiên tôi lo ngại về 'các hình phạt' mà tôi có thể giới thiệu bằng cách làm điều này.Kotlin khi sử dụng trong điều kiện đơn giản
Tôi không thực sự là một chuyên gia về bytecode, nhưng tôi có thể thấy rằng đối với cùng một 'logic', mệnh đề khi có nhiều hoạt động bytecode hơn.
tập tin đơn giản với 3 chức năng khác nhau Kotlin
package com.whatever
fun method1(): String {
return if (BuildConfig.DEBUG) "something" else "else"
}
fun method2(): String {
return if (BuildConfig.DEBUG) {
"something"
} else {
"else"
}
}
fun method3(): String {
return when (BuildConfig.DEBUG) {
true -> "something"
else -> "else"
}
}
tạo bytecode
// access flags 0x19
public final static method1()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 4 L0
GETSTATIC com/whatever/BuildConfig.DEBUG : Z
IFEQ L1
LDC "something"
GOTO L2
L1
LDC "else"
L2
ARETURN
L3
MAXSTACK = 1
MAXLOCALS = 0
// access flags 0x19
public final static method2()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 8 L0
GETSTATIC com/whatever/BuildConfig.DEBUG : Z
IFEQ L1
L2
LINENUMBER 9 L2
LDC "something"
L3
GOTO L4
L1
LINENUMBER 11 L1
LDC "else"
L5
LINENUMBER 8 L5
L4
ARETURN
L6
MAXSTACK = 1
MAXLOCALS = 0
// access flags 0x19
public final static method3()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 16 L0
GETSTATIC com/whatever/BuildConfig.DEBUG : Z
ISTORE 0
L1
LINENUMBER 17 L1
ILOAD 0
ICONST_1
IF_ICMPNE L2
L3
LDC "something"
GOTO L4
L2
LINENUMBER 18 L2
LDC "else"
L5
LINENUMBER 16 L5
L4
ARETURN
L6
MAXSTACK = 2
MAXLOCALS = 1
Ai đó có thể chỉ ra cách đáng kể chi phí này là gì? Và chúng ta nên cố gắng tránh xa mô hình này cho các hoạt động đơn giản?
Cảm ơn
Điều thú vị là mệnh đề 'khi' trở thành mệnh đề' if' sau khi biên dịch thành bytecode và dịch ngược lại thành Java. Tôi đoán một số tối ưu hóa trình biên dịch được đặt ra cho logic này. Cảm ơn câu trả lời. –