[Kotlin] What'a new in Kotlin 1.5.0 #1 - Value class
2281 ワード
Kotlin 1.6.0リリースのこの時点で、いきなりKotlin 1.5.0をアレンジ!
Value class
プライマリコンストラクタには1つのプロパティしかありません の実行時にinline classはsingle属性として表されるからです! メンバー属性、関数、init を使用できます.は、他のインターフェース を実装することができる.
新しいタイプを指定し、実行時に既存のタイプとしてtype aliasと同じように表示します.両者の違いは何ですか.
type aliasは、その名の通り既存のタイプの別名(assignment-combinant)であり、既存のタイプの代替名である.しかしinline classは本当に新しいタイプです.res.
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)
特長
fun checkPassword(password: String)
// define
class Password(val s: String)
fun checkPassword(password: Password)
// use
checkPassword(Password("..."))
@JvmInline
value class Password(val s: String)
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
Reference
この問題について([Kotlin] What'a new in Kotlin 1.5.0 #1 - Value class), 我々は、より多くの情報をここで見つけました
https://velog.io/@cchloe2311/Kotlin-Whata-new-in-Kotlin-1.5.0-1-Value-class
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について([Kotlin] What'a new in Kotlin 1.5.0 #1 - Value class), 我々は、より多くの情報をここで見つけました https://velog.io/@cchloe2311/Kotlin-Whata-new-in-Kotlin-1.5.0-1-Value-classテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol