[Kotlin] What'a new in Kotlin 1.5.0 #1 - Value class

2281 ワード

Kotlin 1.6.0リリースのこの時点で、いきなりKotlin 1.5.0をアレンジ!

Value class


Kotlin 1.5.0はValue Classをリリースしました!これはInline classでよく知られているKotlin言語の特性です.よく調べます.

Why

fun checkPassword(password: String)
このような関数があると言いましょう.可読性のために、password: Stringをwrapper classとして使用した.
// define
class Password(val s: String)
fun checkPassword(password: Password)

// use
checkPassword(Password("..."))
このように使うと確かに可読性が向上しますが、性能は?ランタイムオーバーヘッドが発生しました.呼び出し時に新しいオブジェクトが作成され、hip領域に割り当てられるためです.特にprimitive typeは運転時に最適化され、パッケージの値がprimitive typeであれば性能に大きな影響を及ぼす.

How


ソースコードがJVMによってバイトコード(.class)に変換された場合、オブジェクトとして処理せずに属性として処理するクラスを指定します.
すなわち、オブジェクトの作成にかかるコストをオブジェクトとして最適化しない.

What

value修飾子を使用して宣言し、@JvmInline注釈を追加します.
@JvmInline
value class Password(val s: String)

特長

  • プライマリコンストラクタには1つのプロパティしかありません
  • の実行時にinline classはsingle属性として表されるからです!
  • メンバー属性、関数、init
  • を使用できます.
  • は、他のインターフェース
  • を実装することができる.

    vs. type alias


    新しいタイプを指定し、実行時に既存のタイプとしてtype aliasと同じように表示します.両者の違いは何ですか.
    type aliasは、その名の通り既存のタイプの別名(assignment-combinant)であり、既存のタイプの代替名である.しかしinline classは本当に新しいタイプです.
    typealias NameTypeAlias = String
    
    @JvmInline
    value class NameInlineClass(val s: String)
    
    fun acceptString(s: String) {}
    fun acceptNameTypeAlias(n: NameTypeAlias) {}
    fun acceptNameInlineClass(p: NameInlineClass) {}
    
    fun main() {
        val nameAlias: NameTypeAlias = ""
        val nameInlineClass: NameInlineClass = NameInlineClass("")
        val string: String = ""
    
        acceptString(nameAlias) // OK: pass alias instead of underlying type
        acceptString(nameInlineClass) // Not OK: can't pass inline class instead of underlying type
    
        // And vice versa:
        acceptNameTypeAlias(string) // OK: pass underlying type instead of alias
        acceptNameInlineClass(string) // Not OK: can't pass underlying type instead of inline class
    }

    res.


    https://kotlinlang.org/docs/inline-classes.html