咱们好,本篇文章依然聊聊kotlin官方做的一些优化作业,首要包括以下三个方面:

  1. 数据对象data object的支撑
  2. @Repeatable注解的优化

接下来就带咱们介绍下上面三个特性。

一. 数据对象data object的支撑

该特性由kotlin1.7.20插件版别供给,并处于实验阶段。

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

这个特性首要是和原来的object声明的单例类的toString()办法输出有关,在了解这个特性之前,咱们先看下下面一个比如:

object Single1
fun main() {
    println(Single1)
}

输出:

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

这个输出本质上便是一个类名、@、地址的拼接,有时候你想要打印输出的仅仅是类名,就得需求重写下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)
}

输出:

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

能够看到,咱们都是密封子类,但就这个Loading类的输出比较”丑陋”,没有上面两个兄弟类的输出简练清新。

接下来咱们就要介绍下主人公数据对象data object了,这个东西其实运用起来和object一模一样,中心的差异便是前者的toString() 愈加简练。

接下来从一个比如一探究竟:

data object Single2
fun main() {
    println(Single2)
}

看下输出:

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

输出是不是比上面的object Single1愈加简略明了。最重要的是在密封类中运用效果愈加,咱们把上面密封类Loading声明为data object

    data object Loading : Response

看下最终的输出成果:

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

这下子输出成果是不是清新更多!!

讲完了应用,咱们再java的角度看下其背面的完成机制,相比较于objectdata 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插件版别供给优化。

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

在了解这个特性之前,咱们先回想下@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 {
}

请注意:

  1. 假如非要显现声明一个注解容器,其特点的称号一定要为value
  2. 其次,注解容器和可重复性直接不能一起声明在同一个元素上;

别的,其实这个特性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优化小技巧,了解一下~