聊聊kotlin的val跟var

2021-09-29 15:30:29 浏览数 (1)

了解kotlin,最先接触的就是val跟var了,下面详细说说这两个字段的特性

val

val:英文读value,代表是immutable, 只读的意思 比如下面这个kotlin代码

val item = "I am val"

转成对应的java代码如下

代码语言:javascript复制
@NotNull
private final String item = "I am val";

@NotNull
public final String getItem() {
   return this.item;
}

声明了一个final的String,并且设置了一个get方法,确实说明了val的修饰的变量,只能赋值一次,后续无法再次赋值

如果我在前面加个private修饰符

private val name = "I am val"

对应的java代码

代码语言:javascript复制
private final String name = "I am val";

可以发现,对应的get方法没有了

其实这种写法,真的是非常的优雅;

对于java来说,很多人声明一个变量的时候,常常忘记加final修饰语,从而埋下了隐患,比如这个变量传到其他方法中,或者再其他的使用中,不小心给他重新赋值,或者把这个变量置空,导致了其他不可预期的问题

但是kotlin只需要一个val就可以快速实现这个特性,很方便优雅

这一点,在java的圣经《Effective Java》中,也有提及,叫做:

Minimize mutability

Immutable classes are easier to design, implement, and use than mutable classes. They are less prone to error and are more secure.

所以使用val是一种更安全,更不容易出错的写法,再后续的开发中,应该尽量使用val修饰符 就像里面所说的

var

var:英文读variable,变量的意思,也就是指的mutable 比如下面这个kotlin代码

var item = "I am var"

对应的java代码

代码语言:javascript复制
@NotNull
private String item = "I am val";

@NotNull
public final String getItem() {
   return this.item;
}

public final void setItem(@NotNull String var1) {
   Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
 this.item = var1;
}

var做了三件事

  1. 声明了一个private变量
  2. 生成了对应的get方法
  3. 生成了对应的set方法

不知细心的你有没有注意到,set方法的参数有一个@NotNull的修饰符,还有一个Intrinsics.checkParameterIsNotNull(var1, "<set-?>")的方法

如果编译期可以判断是null,不小心传了null,这里就会编译不过,提示你修复,如果编译器判断不了,避免错误,在运行的时候,也会直接崩溃来提示你

简简单单的一个修饰符,却可以帮我们做这么多事情,是不是深深迷上了kotlin了

写到这里,对于自动生成的get方法跟set方法,如果我们要自定义实现,要怎么办

可以用下面的方式

代码语言:javascript复制
var name = "I am var"
        get() {
            return "I am get method"
        }
        set(value) {
            field = value   "setValue"
        }

需要注意的是,kotlin的set方法,取当前的变量,是用field这个关键字

这个是对应的java的代码

代码语言:javascript复制
@NotNull
   private String name = "I am var";

   @NotNull
   public final String getName() {
      return "I am get method";
   }

   public final void setName(@NotNull String value) {
      Intrinsics.checkParameterIsNotNull(value, "value");
      this.name = value   "setValue";
   }

可以看出来,对应的get跟set方法都变了

简简单单的val跟var,其实隐藏了很多信息,这里做个介绍 有任何疑问,欢迎微信交流

0 人点赞