了解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做了三件事
- 声明了一个private变量
- 生成了对应的get方法
- 生成了对应的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,其实隐藏了很多信息,这里做个介绍 有任何疑问,欢迎微信交流