探索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