先看下kotlin里的set和get的语法

var <propertyName>[: <PropertyType>] [= <property_initializer>][<getter>][<setter>]

格式就如上所示, set和get可写也可不写, 不写的话会有默认的实现, 需要注意的是val修饰的变量是没有set方法的, 也不允许重写set方法, 例如下面这种写法, 会提示不允许有set方法

看一个完整的实例代码

package com.wbing.kotlindemoclass Student {var name : String = "zhang"// 这里使用field而不是使用lastName, 是因为如果使用lastName会造成递归调用从而造成内存溢出, 因为使用lastName也会涉及到调用set/get的问题get() = field.toUpperCase()var no : Int = 0get() = fieldset(value) {if (value < 10) {field = value} else {field = -1}}var classTeacher : String? = "孔子"set(value) = if (value == null) {field = "孔圣人"} else {field = value}/*set(value) = if (value == null) {this.classTeacher = "孔圣人"} else {this.classTeacher = value}*/var isKZ : Boolean = trueget() {return this.classTeacher == "孔圣人"}var className : String ? = "1班"
//        private set
}fun main(args: Array<String>) {var stu: Student = Student()stu.name = "wang"println("lastName:${stu.name}")stu.no = 9println("no:${stu.no}")stu.no = 20println("no:${stu.no}")stu.classTeacher = nullprintln(stu.classTeacher)println(stu.isKZ)stu.className = "一年一班"println(stu.className)
}

以上的代码运行结果如下:

lastName:WANG
no:9
no:-1
孔圣人
true
一年一班

对于代码需要说明的有几点:

1. field的用法, field被大神们翻译成Backing Fields(后端变量), 它的作用就类似于java里的this.属性名, 例如上面代码中的第六行get() = field.toUpperCase(), 就相当于java里的 this.name.toUpperCase(),  但是不能直接使用this.name会造成递归调用内存溢出的,  因为在set和get中是不允许有本身的局部变量的(例如如果你属性名是name, 在set/get里是不能有这个变量的), 因为属性的调用也涉及到了set/get会造成递归调用, 所以要解决引用自身的问题, kotlin发明了field(后端变量)来解决这个问题

注意不是set/get里不允许有局部变量, 是不允许有和属性本身相同名字的局部变量, 下面这种写法是没问题的

    var test : Int = 0get() {var t = 1field = treturn field}

2. 注意代码中的第30~33行, 为什么使用this.classTeacher不报错, 是应为这个get方法是isKZ属性的get, 而不是classTeacher的get方法

3. 如果把第36行的注释打开那么main方法里的stu.className="一年一班"会报如下错误

Error:(62, 5) Kotlin: Cannot assign to 'className': the setter is private in 'Student'

提示className属性的setter是私有的不能被赋值,  通过这种方式我们可以禁止某些属性被修改,  需要注意的是get方法不能随便定义成private的,  需要和变量的可见范围是一样的, 如果变量是public的, 那么get是不能设置成private的例如

    var className : String ? = "1班"private setprivate get

这个会报错: Error:(37, 9) Kotlin: Getter visibility must be the same as property visibility

Kotlin之Set和Get相关推荐

  1. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  2. 在kotlin companion object中读取Bean,注入Bean对象

    在kotlin companion object中读取Bean,注入Bean对象 在使用kotlin时,或多或少地会使用到一些公共组件,如 http. mongo. redis相关的组件.   使用组 ...

  3. 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置

    在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...

  4. kotlin中继承父属性使用构造方法

    kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...

  5. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  6. SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

    SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...

  7. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  8. Gradle 将项目publish到Nexus,Kotlin将项目发布到nexus,springboot项目发布到maven仓库

    示例见:Gitte 公仓设置 在项目中添加maven-publish的插件 plugins {kotlin("jvm") version "1.3.72"kot ...

  9. kotlin Bean加载失败lateinit property has not been initialized

    Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat ...

  10. kotlin重写构造方法编译报错:Primary constructor call expected

    在kotlin中使用construct关键字定义构造方法,如果类定义时已经有构造方法(类名后带括号),需要添加构造方法时,需要使用以下写法: class User(var name,var age){ ...

最新文章

  1. 神操作!美国程序员把工作外包给中国程序员,上班摸鱼吸猫年入 20 万美元
  2. java内置_自包含的应用程序,内置Java
  3. 谷歌体三维捕捉新突破:实现后期任意照明修改
  4. 超强整理!PCB设计之电流与线宽的关系
  5. python—sql语句参数化
  6. shell 进入hadoop_php通过shell调用Hadoop的方法
  7. linux svn可视化工具,CentOS6.5安装SVN 可视化管理工具iF.SVNAdmin
  8. 前端代码:html、css(图文混排)文字环绕 - 案例篇
  9. 腾讯云公布5G产品矩阵;IntelliJ IDEA 2020.2.1发布| 极客头条
  10. 动态合并Repeater控件数据列
  11. 如何从零构建你的自动化运维体系?——从制度到技术
  12. 开源html5游戏-少年行
  13. java-Servlet编码/异常处理
  14. SysUtils.UpperCase、SysUtils.LowerCase - 大小写转换
  15. PAT 甲级 1003 Emergency 25分
  16. 学习OpenCV研究报告指出系列(二)源代码被编译并配有实例project
  17. Oracle 考试概要
  18. 山还是山 水还是水
  19. java魔箭天使apk_java魔箭天使apk下载|java游戏魔箭天使安装包下载v1.0....
  20. C/C++编程:写了placement new也要写placement delete

热门文章

  1. flutter dio网络请求 get post 图片上传
  2. 明德文理学院的计算机,今日迎来全球计算机强校CMU卡耐基梅隆,多少中国学生获得青睐?...
  3. Linux系统代理上网
  4. Linux 面试知识点
  5. 安装虚拟光驱时提示windows无法访问指定设备、路径或文件。可能没有权限访问该项目
  6. SQL难学吗,有什么好的学习建议?(转载)
  7. QGC地面站使用教程
  8. 小说更新太慢怎么办_小说:圣墟(挺好看的一部小说,现在更新非常慢)
  9. 跨境电商拼多多详情接口API数据获取示例
  10. 巨人10Q4财报:营收3.6亿元环比增8.7%