Java中getter和setter方法
在Java中,无论是数据模型类(JavaBean),还是自己定义的某个对象中的属性,都需要自己手动定义getter和setter方法,下面以Bird对象为例,定义的getter和setter方法如下:
public class Bird{
private String color="Yellow";
private int age=0;
private String sex="female";
public String getColor(){
return this.color;
}
public void setColor(String color){
this.color=color;
}
public int getAge(){
return this.age;
}
public void setAge(int Age){
this.age=age;
}
public String getSex(){
return this.sex;
}
public void setSex(String sex){
this.sex=sex;
}
}
Kotlin中的getter和setter方法
在Kotlin中,定义对象属性中的getter和setter方法默认是隐藏
的,此外,所谓的getter和setter方法是以get(){xxx}和set(value){xxx}方法存在于Kotlin中,与Java中的案例一样,表现与上面Java中相一致的逻辑代码如下:
class Bird(var color:String,var age:Int,var sex:String)
或者
class Bird{
var color:String=""
var age:Int=-1
var sex:String=""
}
在Androidstudio的Tools->Kotlin->Show Kotlin Bytecode可查看编译成Kotlin字节码:
点击Decompile可反编译成Java的代码:
最终可以发现在Kotlin中一句代码就可以实现Java中的getter和setter代码:
@Metadata(
mv = {1, 4, 2},
bv = {1, 0, 3},
k = 1,
d1 = {"\u0000\u001c\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0005\n\u0002\u0010\u000e\n\u0002\b\b\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002R\u001a\u0010\u0003\u001a\u00020\u0004X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0005\u0010\u0006\"\u0004\b\u0007\u0010\bR\u001a\u0010\t\u001a\u00020\nX\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u000b\u0010\f\"\u0004\b\r\u0010\u000eR\u001a\u0010\u000f\u001a\u00020\nX\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0010\u0010\f\"\u0004\b\u0011\u0010\u000e¨\u0006\u0012"},
d2 = {"Lcom/edw/kotlinlearndemo/Bird;", "", "()V", "age", "", "getAge", "()I", "setAge", "(I)V", "color", "", "getColor", "()Ljava/lang/String;", "setColor", "(Ljava/lang/String;)V", "sex", "getSex", "setSex", "KotlinLearnDemo.app"}
)
public final class Bird {
@NotNull
private String color = "";
private int age = -1;
@NotNull
private String sex = "";
@NotNull
public final String getColor() {
return this.color;
}
public final void setColor(@NotNull String var1) {
Intrinsics.checkNotNullParameter(var1, "<set-?>");
this.color = var1;
}
public final int getAge() {
return this.age;
}
public final void setAge(int var1) {
this.age = var1;
}
@NotNull
public final String getSex() {
return this.sex;
}
public final void setSex(@NotNull String var1) {
Intrinsics.checkNotNullParameter(var1, "<set-?>");
this.sex = var1;
}
所以,在Kotlin中以最简洁的代码实现了与Java相同功能,在Kotlin是默认隐藏get(){xxx}和set(value){xxx}方法,这个两个默认方法表现形式如下:
class Bird {
var color: String = ""
get() {
return field
}
set(value) {
field = value
}
var age: Int = -1
get() {
return field
}
set(value) {
field = value
}
var sex: String = ""
get() {
return field
}
set(value) {
field = value
首先,get(){xxx}和set(value){xxx}必须写在对应的属性下方
,这样field字段
获取的值才能与属性值相对应,
Kotlin中的get()和set()高级用法
前面案例中,我们可以看到Bird对象在kotlin中可以以一句代码就解决了需要在Java代码中要用很多代码解决的getter和setter的问题,下面我们可以扩展下针对Kotlin中的get()和set()高级用法,针对上面的Bird对象我们可以稍微改下:
class Bird {
var color: String = ""
var age: Int=-1
get() {
return if (field > 0) field else 0
}
var sex: String = ""
get() {
return if (color == "Yellow") "male" else "female"
}
}
fun main() {
val bird = Bird()
bird.color = "Yellow"
bird.age = -4
println("这只鸟的颜色是->${bird.color},年龄->${bird.age},性别->${bird.sex}")
//这只鸟的颜色是->Yellow,年龄->0,性别->male
}