探索Kotlin 1.8.20新特性

 Kotlin 1.8.20已经发布,我们将探索一些新功能和改进。
- 我们将仅涵盖新的语言功能和标准库更新。
- 请参考参考资料部分以了解此版本的完整详情。
语言更新
Enum 类entries函数
 
为什么需要这个函数?
 values() - 返回数组,大多数情况下我们会将其转换为列表进行操作。与列表相比,数组的性能较低。
 
enum class Language(val extension: String) {
    Kotlin(".KT"),
    Java(".java"),
    Dart(".dart")
}
// values - Returns Array
val languageValues:Array<Language> = Language.values()
// New function entries - Returns List
val languageEntries:List<Language> = Language.entries
Data objects
- 为了提高可读性,我们引入了这个新特性。
- 它具有整洁清晰的toString()表示形式。
object EmployeeObject
data object EmployeeDataObject
// Output
println(EmployeeObject)
println(EmployeeDataObject) 
// EmployeeObject@50040f0c
// EmployeeDataObject
在内联类中次级构造函数可有函数体
从1.8.20版本开始,我们可以在内联类中使用带有函数体的次构造函数。
@JvmInline
value class Employee(private val fullName: String) {
    // Allowed since Kotlin 1.4.30:
    init {
        check(fullName.isNotBlank()) {
            "Full name shouldn't be empty"
        }
    }
    // Preview available since Kotlin 1.8.20:
    constructor(firstName: String, middleName:String, lastName: String) : this("$firstName $middleName $lastName") {
        check(lastName.isNotBlank()) {
            "Last name shouldn't be empty"
        }
    }
}
标准库更新
新增了Autocloseable接口
为了关闭资源,常见的标准库中添加了AutoCloseable接口。
 还包括了扩展函数use(),它在所选资源上执行给定的块函数,然后无论是否抛出异常,都会正确关闭它。
Base64编码和解码
现在在Kotlin中我们有了Base64的支持,所以不再需要Java了
有三种类型可用:
 Base64.Default、Base64.UrlSafe和Base64.Mime
@OptIn(ExperimentalEncodingApi::class)
fun base64Experimental() {
    // Base64.Default
    val nameBytes = "Nav".map { it.code.toByte() }.toByteArray()
    val encodedValue = Base64.Default.encode(nameBytes)
    // Encode value: TmF2
    println("Encoded: $encodedValue") 
    // Decoded value: Nav
    println("Decoded: ${String(Base64.Default.decode(encodedValue))}")
    
    // Base64.UrlSafe
    val googleIOUrlBytes = "google.io".map { it.code.toByte() }.toByteArray()
    // Encode value: Z29vZ2xlLmlv
    val encodedURLSafe = Base64.UrlSafe.encode(googleIOUrlBytes)
    println("Encoded UrlSafe: $encodedURLSafe")
    // Decoded value: google.io
    println("Decoded UrlSafe: ${String(Base64.UrlSafe.decode(encodedURLSafe))}")
}
对Kotlin/Native的@Volatile注解的支持
在1.8.20之前,@Volatile注解只在公共标准库中可用,并且在JVM中有效。
class Developer {
    @Volatile
    private var isAndroidDev: Boolean = false
    fun isAndroidDevloper(): Boolean = isAndroidDev
    fun setAndroidDev(isAndroidDev: Boolean) {
        this.isAndroidDev = isAndroidDev
    }
}
Kotlin/JVM
- Java合成属性引用的预览功能
public class Developer {
    private String name;
    private String coreLanguage;
    public Developer(String name, String coreLanguage) {
        this.name = name;
        this.coreLanguage = coreLanguage;
    }
    public String getName() {
        return name;
    }
    public String getCoreLanguage() {
        return coreLanguage;
    }
}
- 使用引用调用属性
val developer = Developer("Nav", "Kotlin")
    // references to Java synthetic properties
    print("Developer name is ${developer::name}")
参考
[kotlin1.8.20新特性] https://kotlinlang.org/docs/whatsnew1820.html



















