2017-09-29 43 views
2

在Java中,我們可以這樣做:Java靜態最終在科特林:常量 'VAL' 初始化應該是一個恆定值

public class TestA { 
    public static final boolean flag = true; 
    public static final String str = flag ? "A" : "B"; // ok 
} 

,但不能在科特林

class TestA { 
    companion object { 
     const val flag = true 
     const val str = if (flag) "A" else "B" //err: Const 'val' initializer should be a constant value 

     val str2 = if (flag) "A" else "B" //ok, but not equals [public static final] in Java. 
    } 
} 

試圖@JvmStatic on non-const str2,但是反編譯爲java代碼,它是

private static final String str2 = "A" 
public static final String getStr2() { 
     return Companion.getStr2(); 
    } 

問題:kotlin if-else等於?: in java,但不能用於const val。爲此需要解決方案。

回答

6

Kotlinconst關鍵字只能在值爲編譯時間常量時使用。你的情況不是(const val str = if (flag) "A" else "B")。如果條件在編譯時間不恆定的情況下將值傳遞給str,則正在使用該條件。

所以你只是刪除const關鍵字,它會完美的工作。因爲val在Java中創建了與final相同的不可變變量。但是如果const被移除,則存在權衡。它會在引擎蓋下產生不必要的對象和訪問該變量的getter。爲了解決這個問題,使用@JvmField註釋,你很好。

要閱讀更多去Where Should I Keep My Constants in Kotlin?

希望它能幫助。

+0

帶@JvmField的非const val不會創建getter,它是** public static final **,那就是我正在尋找的!謝謝。 – lymoge