Kotlin的getter和setter

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
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值