Kotlin 1.9 新特性预览:data object (数据单例)

这篇具有很好参考价值的文章主要介绍了Kotlin 1.9 新特性预览:data object (数据单例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Kotlin 1.9 新特性预览:data object (数据单例),Kotlin,kotlin,android,data object,数据类,data class

前言

data object (数据单例) 是 Kotlin 1.9 中预定引入的新特性 ,但其实从 1.7.20 开始就可以预览了。启动预览需要在 gradle 中升级 KotlinCompileVersion:

tasks.withType<KotlinCompile> {
    kotlinOptions.languageVersion = "1.9"
}

接下来让我们看看它有哪些特点。

提升 toString() 可读性

data object 相对于普通 object ,在调用 toString() 的时候,前者的可读性更好,输出类名,不再携带 HashCode

object SampleObject
data object SampleDataObject

fun main() {
    println(SampleObject)     // => SampleObject@58ceff1
    println(SampleDataObject) // => SampleDataObject
}

反编译后代码如下

public final class SampleDataObject {
   // ...

   @NotNull
   public String toString() {
      return "SampleDataObject";
   }
}

equals() 恒为 true

对于普通的 object class,因为是单例,所以使用 == 进行比较时通常返回 truedata object 也同样如此:

object SampleObject
data object SampleDataObject

fun main() {
    println(SampleObject == SampleObject) // => true
    println(SampleDataObject == SampleDataObject) // => true
}

object class 反编译后其实是一个构造函数私有化的单例模式,如下

//反编译 "object SampleObject"
public final class SampleObject {
   @NotNull
   public static final SampleObject INSTANCE;

   private SampleObject() { // private constructor
   }

   static {
      SampleDataObject var0 = new SampleObject();
      INSTANCE = var0;
   }
}

所以可以通过反射调用构造函数创建不同 object class 的实例。此时有可能 == 会因为实例不同而返回 false

object SampleObject

fun main() {
    val newInstance = (SampleObject.javaClass.declaredConstructors[0].apply {
        isAccessible = true
    } as Constructor<SampleObject>).newInstance()

    println(SampleObject == newInstance) // => false
}

但是对于 data object 而言,即使像上面这样调用 == 也是返回 true

data object SampleDataObject

fun main() {
    val newInstance = (SampleDataObject.javaClass.declaredConstructors[0].apply {
        isAccessible = true
    } as Constructor<SampleDataObject>).newInstance()

    println(SampleDataObject == newInstance)  // => true
    println(SampleDataObject === newInstance) // => false
}

此时,只有调用 === 才会认为是两个地址,返回 false
kotlin 的 == 其实就是调用 equlas,那我们看看 data objectequals 反编译后的实现,原来是通过 instanceOf 进行比较,所以自然恒为 true

public final class SampleDataObject {
   // ...

   public int hashCode() {
      return 1802936564;
   }

   public boolean equals(@Nullable Object var1) {
      if (this != var1) {
         if (!(var1 instanceof SampleDataObject)) {
            return false;
         }
      }

      return true;
   }
}

按照 Java 规范,两个实例的 equlas 相等,则 hashCode 也必须相等,可以看到 hashCode 是一个常量值,所以自然相等。

Sealed 的好伴侣

我们在经常会使用 Sealed class/interface 定义可枚举的状态。此时经常会使用 object class,如下

sealed class State {
    object Loading : State()
    data class Success<T>(val response: Response<T>) : State()
    data class Error(val reason: Throwable): State()
}

requestData().subscribe { state -> 
   println("requestData: $state")  // requestState: State$Loading@34ce8af7
}

SuccessError 都是 data class ,toString() 经过优化,会打印出 Success(response= ...)Error(reason=...) 等有效信息。而 Loading 则打印出毫无意义的 HashCode 等对象信息。

data object 可以更好地配合 Sealed class/interface,让输出更有意义。

sealed class State {
    data object Loading : State()
    data class Success<T>(val response: Response<T>) : State()
    data class Error(val reason: Throwable): State()
}

val state = State.Loading
println("State: $state") // State: Loading

今后 Sealed 中如果没有使用 data object,IDE 会给出警告建议。

Kotlin 1.9 新特性预览:data object (数据单例),Kotlin,kotlin,android,data object,数据类,data class

与 data class 的区别

data object 兼具了 data classobject 的特性。但是 data class 编译期会生成 copy 以及 componentN 方法。而 data object 是个单例,压根没有构造函数,自然不存在“拷贝构造”和“解构”的需求,不会生成 copycomponentN 方法文章来源地址https://www.toymoban.com/news/detail-518069.html

到了这里,关于Kotlin 1.9 新特性预览:data object (数据单例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kotlin的5种单例模式

    前言 最近在学习Kotlin这门语言,在项目开发中,运用到了单例模式。因为其表达方式与Java是不同的。所以对不同单例模式的实现进行了分别探讨。主要单例模式实现如下: 饿汉式 懒汉式 线程安全的懒汉式 双重校验锁式 静态内部类式 PS:该篇文章不讨论单例模式的运用场景

    2024年02月01日
    浏览(34)
  • kotlin实现java的单例模式

    Kotlin的5种单例模式

    2024年02月10日
    浏览(34)
  • Kotlin学习 - object和companion object使用

    object使用 1、实现单例 在文章Kotlin学习 - 数据类与单例类中,如果想声明一个单例类使用的就是object,定义一个全局单例类,代码如下; 还可以在类内部实现一个单例 类内部实现的单例不能访问类外的变量。 2、实现对象表达式(匿名内部类) 作为匿名内部类的时候

    2024年02月13日
    浏览(26)
  • kotlin - data class使用详解

    该文章同步更新到稀土掘金链接 我们经常创建一些只保存数据的类。 在这些类中,一些标准函数往往是从数据机械推导而来的。在 Kotlin 中,这叫做数据类,并标记为data。定义这些类时,编译器为我们做了什么?自动生成了什么内容?我们可以通过使用,并反编译成java代码

    2023年04月11日
    浏览(39)
  • Kotlin单例模式的一种懒汉模式写法

    Kotlin单例模式的一种懒汉模式写法 kotlin用object实现单例模式,companion object与java静态_zhangphil的博客-CSDN博客 kotlin中很容易使用object实现java中的单例模式。由于kotlin中没有static修饰词,可以用companion object实现Java中的static效果。kotlin用object实现单例模式,companion object与java静态

    2024年02月12日
    浏览(34)
  • Kotlin特性学习笔记

    2,by修饰变量,实现属性委托 3,operator修饰方法,表示重写操作符 kotlin所有运算操作符: 一元操作符(Unary Operators) +a a.unaryPlus() -a a.unaryMinus() !a a.not() a++ a.inc() 二元操作符(  Binary Operators)

    2024年01月18日
    浏览(44)
  • Kotlin 丰富的函数特性

    Kotlin 是一门基于 JVM 的现代编程语言,它提供了丰富的函数特性,使得编写简洁、灵活且可读性强的代码成为可能。以下是 Kotlin 函数的一些主要特性: 在 Kotlin 中,使用 fun 来声明函数。函数声明的基本结构如下: functionName 是你为函数取的名字。 parameters 是函数的参

    2024年02月11日
    浏览(34)
  • Kotlin学习第1篇——data class

    Data classes 官方介绍 在学习之前带着问题往往能够收获颇丰 下面开始公布答案: true true false (没有笔误,可以自测下) true true false (没有笔误,可以自测下) Gerry toString 都不可以 如何学习? 查看反编译后的Java代码即可! 如下所示一个简单的 data class 我们来看看反编译后的Java代码长什

    2024年01月20日
    浏览(34)
  • 6、深入解析Kotlin类与对象:构造、伴生、单例全面剖析

    前言 本篇文章将带您了解Kotlin编程中的重要概念:类及构造函数、访问修饰符、伴生对象和单例模式。就像搭积木一样,我们会逐步揭开这些概念的面纱,让您轻松理解它们的作用和用法。无论您是编程新手还是有经验的开发者,本文都将为您提供有趣而易懂的内容,帮助您

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包