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

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

  1. 数据对象data object的支持
  2. @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的角度看下其背后的实现机制,相比较于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的可重复注解不兼容。

总结

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

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

img

相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值