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

2022-06-27 18:54:17 +08:00
 jeesk
```
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 的大佬能讲一讲。
7171 次点击
所在节点    Kotlin
22 条回复
Helsing
2022-06-27 18:56:15 +08:00
看 Kotlin 构造方法的介绍
youngxhui
2022-06-27 18:58:49 +08:00
kotlin data class
cmdOptionKana
2022-06-27 18:58:56 +08:00
你看这个 class Gallery_1(val context: Context),与 class Album(val id: String) 小括号的用法是不是一样?
qianxi0410
2022-06-27 19:00:07 +08:00
scala 没有?
chendy
2022-06-27 19:00:11 +08:00
java 还真有,但是不是 class (虽然也是 class )是 record
FireFoxAhri
2022-06-27 19:00:12 +08:00
有点像 Scala 的 case class
AltairT
2022-06-27 19:02:31 +08:00
https://kotlinlang.org/docs/classes.html

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

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

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

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

在线运行 https://pl.kotl.in/CjwWRrWLl
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
2022-06-27 21:09:40 +08:00
Java 怎么就没有这种用法呢,Java 的 Record 就是这种写法
jeesk
2022-06-27 21:57:05 +08:00
@MakHoCheung 不好意思。 除了楼上说的 scala 的 case 我在 java 真没见过省略参数。 我也是第一次看 kotlin 的代码, 见谅。.我不是搞这玩意的。
youngxhui
2022-06-27 23:04:21 +08:00
@lisongeee 看错了😥
zoharSoul
2022-06-28 14:07:36 +08:00
这不就是构造函数吗
jiulang
2022-06-28 15:35:51 +08:00
record TcpReset(TcpConnection Connection, byte[]? DivertBuffer, WinDivertAddress DivertAddress, long Ticks);
jiulang
2022-06-28 15:36:32 +08:00
kotlin 和 csharp 简直一样
HubOwO
2022-06-28 16:47:52 +08:00
写的没啥问题呀,能省就省了呗,反正是数据类,就是为了声明结构,要那么多 get set 干啥,写多了就很丝滑,看起来也很顺畅,设计思想 歪瑞古德

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/862539

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX