求Java类属性、构造函数及Getter/Setter的Kotlin等价实现
嘿,刚好我对Kotlin类结构很熟,来帮你把这段Java代码转成等价的Kotlin实现,顺便给你理清楚两者的差异,帮你解开困惑~
首先,先给你最贴近原Java代码逻辑的“直译”版Kotlin代码,方便你对照理解:
class SampleClass { // 对应Java的private String var; 这里用varValue避免和Kotlin的关键字var冲突 private var varValue: String? = null // 对应带参数的构造函数 constructor(varValue: String) { this.varValue = varValue } // 对应无参构造函数 constructor() // 对应Java的getVar()方法 fun getVar(): String? { return varValue } // 对应Java的setVar()方法(注:原Java代码里setter返回值写错了,应该是void,这里按正确逻辑实现) fun setVar(varValue: String) { this.varValue = varValue } }
不过这其实是最“Java风格”的Kotlin写法,Kotlin本身提供了更简洁的语法来实现同样的功能,毕竟Kotlin的设计就是为了减少样板代码。
更简洁的Kotlin写法
方式一:主构造函数+次构造函数
Kotlin允许把构造函数直接写在类头里,而且默认会为属性生成getter和setter,代码可以简化成这样:
class SampleClass(private var varValue: String?) { // 无参构造函数,通过调用主构造函数并传入null作为默认值 constructor() : this(null) }
这里的private var varValue: String?直接声明了私有可变属性,Kotlin会自动为它生成对应的getter和setter,你不需要手动写getVar()和setVar()——如果是在Kotlin代码里调用,直接用sampleClass.varValue(不过因为是private,外部类访问不到);如果需要让外部能像Java那样调用getVar()和setVar(),可以看下面的方式。
方式二:和Java方法名完全兼容
如果你希望这个Kotlin类在Java代码里能直接调用getVar()和setVar()(和原Java类的方法名一致),可以用@JvmName注解来指定方法名:
class SampleClass { @get:JvmName("getVar") @set:JvmName("setVar") private var varValue: String? = null constructor(varValue: String) { this.varValue = varValue } constructor() }
这样在Java里调用时,就和原Java类的用法完全一样了。
方式三:使用Data Class(数据类)
如果你的这个类主要是用来存储数据,Kotlin的data class会自动帮你生成equals()、hashCode()、toString()、copy()等实用方法,写起来更省心:
data class SampleClass(var varValue: String?) { constructor() : this(null) }
同样,如果需要和Java的方法名兼容,加上@JvmName注解就可以了。
小总结:Kotlin vs Java 类结构差异
- Kotlin的属性声明直接整合了变量定义、getter和setter,不需要像Java那样分开写样板代码;
- Kotlin的构造函数分为主构造函数(类头的那个)和次构造函数(用
constructor关键字定义),次构造函数必须调用主构造函数或者其他次构造函数; - 用
val声明的是只读属性(只有getter),用var声明的是可变属性(有getter和setter)。
内容的提问来源于stack exchange,提问作者ronan

