前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊kotlin的val跟var

聊聊kotlin的val跟var

作者头像
韦东锏
发布2021-09-29 15:30:29
1.2K0
发布2021-09-29 15:30:29
举报
文章被收录于专栏:Android码农

了解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,其实隐藏了很多信息,这里做个介绍 有任何疑问,欢迎微信交流

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • val
  • var
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档