LoginSignup
6
0

More than 5 years have passed since last update.

Kotlin1.3-m1での変更、追加点とinline classについて

Last updated at Posted at 2018-07-30

1.3のm1きましたわーい

Kotlin1.3 m-1での変更、追加点

  • coroutinesがexperimentalからstableになった
  • when()の中で変数宣言できるようになった
  • @JvmStatic@JvmFieldcompanion object内で使えるようになった
  • annotation calssをネストして宣言できるようになった。
  • 新たにinline classが追加
  • 符号なし整数型の追加
  • SuccessOrFailureクラスの追加
  • Multiplatform random number generator
  • Boolean型にcompanion objectを追加
  • Collection,Map,Array型の拡張関数isNullOrEmptyの追加とSequens型の拡張関数orEmptyの追加

詳細

詳細については、inline classについてをピックアップしたいと思います。

1.3-m1を使うには

kotlin-eapのリポジトリを見に行く必要があります。
とりあえず、gradleのスクリプトをぺたり

build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.3-M1"
}

repositories {
    maven { setUrl("http://dl.bintray.com/kotlin/kotlin-eap") }
    mavenCentral()
}

dependencies {
    compile(kotlin("stdlib-jdk8"))
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

こんなかんじ、GradleのスクリプトをKotlinで書いてるけどgroovyの方でもまぁ大体一緒

inline classについて

inline classには通常のクラスとは違って以下の制約があります。

  • primary constructorに必ず一つのread-onlypropertyのみを持つ必要がある
  • backing fieldを持つpropertyは定義できない
  • initializer blockを持てない
  • ===での比較は不可能

等など、インライン展開されるので当然といえば当然の制約です。
なんか色々あるから漏れがあるかもしれない😔

簡単な例と、あとはコンパイルされた時のイメージをコードで表したいと思います。

Age.kt
inline class Age(private val value: Int) {
    fun birthYear(): LocalDateTime {
        //todo 雑
        val now = LocalDateTime.now()
        return LocalDateTime.of(now.year - value, now.month,
                now.dayOfMonth, now.hour, now.minute)
    }
}

Main.kt
fun main(args: Array<String>) {
    val age = Age(14)
    println(age.birthYear())
}

実行結果はこんなかんじ

2004-07-30T13:38

なんかprimary constructorのプロパティはprivateにもできるみたい
なぜ

main.ktをコンパイルした際の動作の簡単なイメージとしてはこんな感じになります。

compiled.kt
fun main(args: Array<String>) {
    val age = 14
    val var1 = Age$Erased.birthYear(age)
    println(var1)
}

inline classが持っているプロパティをその場に展開をして、メソッド呼び出しは関数呼び出しに置き換える感じ?(語彙力が無い)

なんでプロパティにprivateを当てられるようになっているのかはよくわかんない。

typealiasに似てますけど、代入互換性はありません。
typealiasやプロパティへの命名と違ってある程度の制約を設けることが可能なので、使用用途としては既存の型のロールとそれに対する操作をまとめたりするのに便利そうだなぁという感想

追記

SuccessOrFailureクラスがinline classだったなぁと
こういう使い方ならたしかにinline classのプロパティにprivateが当てられるようにされてるのも納得しました

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0