V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jeesk
V2EX  ›  Kotlin

最近在看 Kotlin 别人一些代码, 看到如下的代码惊呆了

  •  
  •   jeesk · 2022-06-27 18:54:17 +08:00 · 7115 次点击
    这是一个创建于 876 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ```
    class Gallery_1(val context: Context) {
    private val contentResolver by lazy {
    context.contentResolver
    }

    //
    class Album(
    val id: String,
    val name: String,
    var count: Long = 0,
    // ? 表示可以接受空
    var uri: Uri? = null,
    var file: File? = null
    )
    ```
    class 后面跟上小括号, 搞得我完全不知道这是什么意思了 无法是 java, scala ,go 还是 js 都没有这用法,kotlin 直接不按套路出牌, 晚上也没有查到这个 Album 是什么用法, 有没有 kotlin 的大佬能讲一讲。
    22 条回复    2022-12-24 15:19:48 +08:00
    Helsing
        1
    Helsing  
       2022-06-27 18:56:15 +08:00 via iPhone
    看 Kotlin 构造方法的介绍
    youngxhui
        2
    youngxhui  
       2022-06-27 18:58:49 +08:00 via Android
    kotlin data class
    cmdOptionKana
        3
    cmdOptionKana  
       2022-06-27 18:58:56 +08:00
    你看这个 class Gallery_1(val context: Context),与 class Album(val id: String) 小括号的用法是不是一样?
    qianxi0410
        4
    qianxi0410  
       2022-06-27 19:00:07 +08:00
    scala 没有?
    chendy
        5
    chendy  
       2022-06-27 19:00:11 +08:00
    java 还真有,但是不是 class (虽然也是 class )是 record
    FireFoxAhri
        6
    FireFoxAhri  
       2022-06-27 19:00:12 +08:00
    有点像 Scala 的 case class
    AltairT
        7
    AltairT  
       2022-06-27 19:02:31 +08:00
    https://kotlinlang.org/docs/classes.html

    大哥,自己看看官方文档,没东西括号是可以省略的。现学现卖。
    EscYezi
        8
    EscYezi  
       2022-06-27 19:12:00 +08:00 via iPhone
    如果用过 Lombok ,这个类似于成员变量+AllArgConstructor 的简化版
    bringyou
        9
    bringyou  
       2022-06-27 19:25:46 +08:00
    ps: 自从 java14 开始,也有这个语法了,详见[record class]( https://www.baeldung.com/java-record-keyword)
    lisongeee
        10
    lisongeee  
       2022-06-27 19:33:57 +08:00   ❤️ 2
    @youngxhui #2 《 kotlin data class 》

    都没有 data class 关键字,哪来的 data class ?

    这是在构造器声明属性并初始化属性
    Leviathann
        11
    Leviathann  
       2022-06-27 19:33:59 +08:00   ❤️ 3
    不是 现在连学都不学就可以来吐槽品评语法了吗
    lisongeee
        12
    lisongeee  
       2022-06-27 19:42:25 +08:00
    楼上某些人不要把 data class 和 普通 class 搞混了,楼主代码示例里没有 data class 也没有 record class

    这就是 在构造器声明属性并初始化属性

    在线运行 https://pl.kotl.in/CjwWRrWLl
    su100
        13
    su100  
       2022-06-27 20:05:18 +08:00
    // 1
    class Album(
    val id: String,
    val name: String,
    var count: Long = 0,
    var age: Int? = null,
    )

    // 2
    class Album2(id: String, name: String, count: Long, age: Int? = null) {
    val id = id
    var name = name
    var count = count
    var age = age
    }

    // 3
    class Album3(id: String, name: String, count: Long, age: Int? = null) {
    val id: String
    var name: String
    var count: Long
    var age: Int?

    init {
    this.id = id
    this.name = name
    this.count = count
    this.age = age
    }
    }
    ==============
    以上三种写法等价的,如果写成第二种,idea 会提示你可以将 id 、name 这些移到构造函数,就是以一种那样。
    MakHoCheung
        14
    MakHoCheung  
       2022-06-27 21:09:40 +08:00
    Java 怎么就没有这种用法呢,Java 的 Record 就是这种写法
    jeesk
        15
    jeesk  
    OP
       2022-06-27 21:57:05 +08:00 via iPhone
    @MakHoCheung 不好意思。 除了楼上说的 scala 的 case 我在 java 真没见过省略参数。 我也是第一次看 kotlin 的代码, 见谅。.我不是搞这玩意的。
    youngxhui
        16
    youngxhui  
       2022-06-27 23:04:21 +08:00 via Android
    @lisongeee 看错了😥
    zoharSoul
        17
    zoharSoul  
       2022-06-28 14:07:36 +08:00
    这不就是构造函数吗
    jiulang
        18
    jiulang  
       2022-06-28 15:35:51 +08:00
    record TcpReset(TcpConnection Connection, byte[]? DivertBuffer, WinDivertAddress DivertAddress, long Ticks);
    jiulang
        19
    jiulang  
       2022-06-28 15:36:32 +08:00
    kotlin 和 csharp 简直一样
    HubOwO
        20
    HubOwO  
       2022-06-28 16:47:52 +08:00
    写的没啥问题呀,能省就省了呗,反正是数据类,就是为了声明结构,要那么多 get set 干啥,写多了就很丝滑,看起来也很顺畅,设计思想 歪瑞古德
    cenbiq
        21
    cenbiq  
       2022-06-29 10:25:27 +08:00 via iPhone
    这不很多语言都有这种吗,C#/Java 也有啊
    zzAndroid
        22
    zzAndroid  
       2022-12-24 15:19:48 +08:00
    class 后面跟小括号,就代表是个构造函数,括号里的形参就相当于 new 出这个类时默认要传的参数
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5105 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.