咱们好,之前我现已写过了剖析kotlin1.5、1.6、1.7、1.9插件版别新增的一些特性,唯独kotlin1.8的特性还没好好讲讲,本篇文章就带咱们好好剖析下kotlin1.8新增了那些特性,能对咱们日常开发带来哪些协助。

其中Kotlin1.8.0供给的特性有限,本篇文章首要是剖析Kotlin1.8.20供给的一些新特性。下面是支撑该插件的IDE对应版别:

Kotlin1.8新增特性,进来了解一下

一. 供给功能更好的Enum.entries替代Enum.values()

Kotlin1.8新增特性,进来了解一下

在之前,如果咱们想遍历枚举内部元素,咱们通常会写出以下代码:

enum class Color(val colorName: String, val rgb: String) {
    RED("Red", "#FF0000"),
    ORANGE("Orange", "#FF7F00"),
    YELLOW("Yellow", "#FFFF00")
}
fun main() {
    Color.values().forEach {
        println("${it.rgb}--${it.colorName}--${it.name}")
    }
}

可是不知道咱们是否清楚,Color.values() 其实存在功能问题,换句话说,每调用一次该办法,就会触发从头分配一块内存,如果调用的频率过高,就很或许引发内存颤动

咱们可以反编译下枚举类简单看下原因:

Kotlin1.8新增特性,进来了解一下

Color.values()每次都会调用Object.clone()办法从头创建一个新的数组,这便是上面说的潜在的功能问题,github上也有相关的问题链接,感爱好的可以看下:HttpStatus.resolve allocates HttpStatus.values() once per invocation。

一起Color.values()回来的是一个数组,而在咱们大多开发场景中,或许调集运用的频率更高,这就或许涉及到一个数组转调集的操作。

基于以上考虑,Kotlin1.8.20官方供给了一个新的特点:Color.entries这个办法会预分配一块内存并回来一个不可变调集,屡次调用也不会产生潜在的功能问题

咱们简单看下运用:

fun main() {
    Color.entries.forEach {
        println("${it.rgb}--${it.colorName}--${it.name}")
    }
}

输出:

Kotlin1.8新增特性,进来了解一下

一起咱们也可以从反编译的代码中看出区别:

Kotlin1.8新增特性,进来了解一下

不会每次调用都从头分配一块内存并回来。

如果想要运用这个特性,可以加上下面装备:

compileKotlin.kotlinOptions {
    languageVersion = "1.9"
}

另外多说一下,IntelliJ IDEA 2023.1版别也会检测代码中是否存在Enum.values()的运用,存在就提示运用Enum.entries替代。

二. 答应内联类声明次级结构函数

Kotlin1.8新增特性,进来了解一下

内联类在Kotlin1.8.20之前是不答应带body的次级结构函数存在的,也便是说下面的代码运转会报错:

@JvmInline
value class Person( val fullName: String) {
    constructor(name: String, lastName: String) : this("$name $lastName") {
        check(lastName.isNotBlank()) {
            "Last name shouldn't be empty"
        }
    }
}
fun main() {
    println(Person("a", "b").fullName)
}

运转看下结果:

Kotlin1.8新增特性,进来了解一下

如果没有次级结构函数body,下面这样写是没问题的:

    constructor(name: String, lastName: String) : this("$name $lastName")

如果想要支撑带body的次级结构函数,只需要在kotlin1.8.20插件版别上和上一个特性相同添加languageVersion = "1.9"装备即可。

然后上面的代码块运转就没问题了,咱们看下输出:

fun main() {
    println(Person("a", "").fullName)
}

Kotlin1.8新增特性,进来了解一下

准确的执行了次级结构函数body内的逻辑。

三. 支撑java synthethic特点引证

Kotlin1.8新增特性,进来了解一下

这个特性用文字不好解说,咱们直接通过代码去学习下该特性。

当前存在一个类Person1

public class Person1 {
    private String name;
    private int age;
    public Person1(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

在Kotlin1.8.20之前,以下这种写法是会报错的:

Kotlin1.8新增特性,进来了解一下

而是有必要改成sortedBy(Person1::getAge)才能运转通过。

和上面特性相同,如果想要支撑Person1::age这种引证方法,只需要在kotlin1.8.20插件版别上和上一个特性相同添加languageVersion = "2.1"装备即可。

PS:请注意,Kotlin官方网站提示装备languageVersion = "1.9" 就能运用上面的实验特性,可是编译器仍是提示报错,然后你找报错提示信息改成了languageVersion = "2.1" 就正常了。

Kotlin1.8新增特性,进来了解一下

四. 新Kotlin K2编译器的更新

Kotlin1.8新增特性,进来了解一下

便是说目前Kotlin K2编译器仍是一个实验阶段,不过Kotlin官方在其stable的路上又添加了一些更新:

  1. 序列化插件的预览版别;
  2. JS IR编译器的alpha支撑;
  3. Kotlin2.0版别特性的引入;

如果咱们想要体会下最新版的Kotlin K2编译器,添加装备:languageVersion ="2.0"即可。

五. Kotlin规范库支撑AutoCloseable

Kotlin1.8新增特性,进来了解一下

这个AutoCloseable 接口便是用来支撑资源封闭的,调配供给的use扩展函数,就能协助咱们在资源流运用完毕后自动封闭。

Kotlin之所以在规范库中支撑,应该是想要支撑多渠道吧。

六. Kotlin规范库支撑Base64编解码

这儿不做太多介绍,看下面的运用比如即可:

Kotlin1.8新增特性,进来了解一下

七. Kotlin规范库@Volatile支撑Kotlin/Native

@Volatile注解在Kotlin/JVM便是确保线程之间可见性以及有序性的,kotlin官方在Kotlin/Native中也支撑了该注解运用,有爱好的可以实战试下作用。

总结

本篇文章首要是介绍了Kotlin1.8版别新增的一些特性,首要挑了一些我能了解的、常用的一些特性拉出来介绍,希望能对你有所协助。

历史文章

两个Kotlin优化小技巧,你绝对用的上

浅析一下:kotlin委托背后的完成机制

Kotlin1.9.0-Beta,它来了!!

聊聊Kotlin1.7.0版别供给的一些特性

聊聊kotlin1.5和1.6版别供给的一些新特性

kotlin密封sealed class/interface的迭代之旅

优化@BuilderInference注解,Kotlin高版别下了这些“棘手”!

@JvmDefaultWithCompatibility优化小技巧,了解一下~

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。