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

大家好,本篇文章聊聊kotlin官方做的一些优化工作,主要包括以下几个方面:

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

接下来就带大家介绍下上面三个特性。

一. 数据对象data object的支持

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


k1.png

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

object Single1

fun main() {
    println(Single1)
}

输出:

k2.png

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

输出:

k3.png

可以看到,大家都是密封子类,但就这个Loading类的输出比较"丑陋",没有上面两个兄弟类的输出简洁清爽。

接下来我们就要介绍下主人公数据对象data object了,这个东西其实使用起来和object一模一样,核心的区别就是前者的toString() 更加简洁。

接下来从一个例子一探究竟:

data object Single2

fun main() {
    println(Single2)
}

看下输出:


k4.png

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

    data object Loading : Response

看下最终的输出结果:

k5.png

这下子输出结果是不是清爽更多!!

讲完了应用,我们再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插件版本提供优化。

在了解这个特性之前,我们先看一下@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的可重复注解不兼容。

总结

这两个小技巧相信在大家日常开发中还是比较实用的,希望本篇能对你有所帮助。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容