咱们好,本篇文章依然聊聊kotlin官方做的一些优化作业,首要包括以下三个方面:
- 数据对象
data object
的支撑 -
@Repeatable
注解的优化
接下来就带咱们介绍下上面三个特性。
一. 数据对象data object
的支撑
该特性由kotlin1.7.20插件版别供给,并处于实验阶段。
这个特性首要是和原来的object
声明的单例类的toString()
办法输出有关,在了解这个特性之前,咱们先看下下面一个比如:
object Single1
fun main() {
println(Single1)
}
输出:
这个输出本质上便是一个类名、@、地址的拼接,有时候你想要打印输出的仅仅是类名,就得需求重写下toString()
办法:
object Single1 {
override fun toString(): String {
return "Single1"
}
}
然后再看一个密封类的比如:
sealed interface Response {
data class Success(val response: String): Response
data class Fail(val error: String): Response
object Loading : Response
}
fun main() {
println(Response.Success("{code: 200}"))
println(Response.Fail("no net"))
println(Response.Loading)
}
输出:
能够看到,咱们都是密封子类,但就这个Loading
类的输出比较”丑陋”,没有上面两个兄弟类的输出简练清新。
接下来咱们就要介绍下主人公数据对象data object
了,这个东西其实运用起来和object
一模一样,中心的差异便是前者的toString()
愈加简练。
接下来从一个比如一探究竟:
data object Single2
fun main() {
println(Single2)
}
看下输出:
输出是不是比上面的object Single1
愈加简略明了。最重要的是在密封类中运用效果愈加,咱们把上面密封类Loading
声明为data object
:
data object Loading : Response
看下最终的输出成果:
这下子输出成果是不是清新更多!!
讲完了应用,咱们再java的角度看下其背面的完成机制,相比较于object
,data object
会多了下面这三个重写办法:
public final class Single2 {
@NotNull
public String toString() {
return "Single2";
}
public int hashCode() {
return -535782198;
}
public boolean equals(@Nullable Object var1) {
if (this != var1) {
if (!(var1 instanceof Single2)) {
return false;
}
Single2 var2 = (Single2)var1;
}
return true;
}
}
咱们需求关怀的toString()
办法便是直接重写回来了当时的类名。
假如想要运用这个特性,咱们只需求添加如下装备即可:
compileKotlin.kotlinOptions {
languageVersion = "1.9"
}
二. @Repeatable
注解优化
该特性由kotlin1.6.0插件版别供给优化。
在了解这个特性之前,咱们先回想下@Repeatable
这个注解在java中的运用:
假如一个注解在某个办法、类等等上面需求重复运用,那就需求@Repeatable
协助。
- 首要界说需求重复运用的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(Fruits.class)
public @interface Fruit {
String name();
String color();
}
- 然后界说注解容器,用来指定可重复运用的注解类型
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Fruits {
Fruit[] value();
}
然后就能够在代码中这样运用:
@Fruits({
@Fruit(name = "apple", color = "red"),
@Fruit(name = "origin", color = "yellow"),
})
public class Detail {
}
咱们有没有发现,可重复注解界说起来仍是由一丢丢的费事,接下来轮到咱们kotlin重磅反击了。先看下面一个比如:
@Repeatable
annotation class Animal(val name: String)
在kotlin中咱们只要声明一个需求重复运用的注解即可,kotlin编译器会自动协助咱们生成注解容器@Animal.Container
,然后咱们就能在代码中这样运用:
@Animal(name = "dog")
@Animal(name = "horse")
public class Detail {
}
是不是非常简略快捷了。
假如你偏要显现指明一个包括注解,也能够,通过以下方法即可完成:
@JvmRepeatable(Animals::class)
annotation class Animal(val name: String)
annotation class Animals(val value: Array<Animal>)
然后除了上面的运用方法,你在kotlin中还能够这样运用:
@Animals([Animal(name = "dog"), Animal(name = "dog")])
class Detail {
}
请注意:
- 假如非要显现声明一个注解容器,其特点的称号一定要为
value
; - 其次,注解容器和可重复性直接不能一起声明在同一个元素上;
别的,其实这个特性kotlin早就支撑了,只不过kotlin1.6.0插件版别之前,kotlin这个特性只只支撑RetentionPolicy.SOURCE生命周期的注解,并且还和java的可重复注解不兼容。
总结
这两个小技巧信任在咱们日常开发中仍是比较有用的,希望本篇能对你有所协助。
参考文章:
Improved string representations for singletons and sealed class hierarchies with data objects
Repeatable annotations with runtime retention for 1.8 JVM target
历史文章
浅析一下:kotlin托付背面的完成机制
Kotlin1.9.0-Beta,它来了!!
聊聊Kotlin1.7.0版别供给的一些特性
聊聊kotlin1.5和1.6版别供给的一些新特性
kotlin密封sealed class/interface的迭代之旅
优化@BuilderInference注解,Kotlin高版别下了这些“毒手”!
@JvmDefaultWithCompatibility优化小技巧,了解一下~