Kotlin:可变或者不可变的属性的使用

1024工场 · · 100 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一、声明属性


  1. Kotlin类可以有属性,属性可以用关键字var声明为可变的,否则使用只读关键字val
  2. 使用属性,只要用名称引用它即可;
class Address {
    //1.声明可变var可变属性,val只读属性
    var name: String = ……
    var street: String = ……
    var city: String = ……
    var state: String? = ……
    var zip: String = ……
}

fun copyAddress(address: Address): Address {
    val result = Address() 
    //2.用名称引用即可,将调用访问器
    result.name = address.name
    result.street = address.street
    // ……
    return result
}

二、Getters与Setters


  1. 声明一个属性的完整语法如下:
    初始化器(initializer)、getter和setter都是可选的;
    属性类型可以从初始器(从getter返回值)推断出来,也可以省略
var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]
  1. 只读属性和可变属性不同:只读用val可变用var只读不允许setter
  2. 编写自定义的访问器像普通函数,在属性声明内部;
  3. 改变访问器可见性或者对其注解,但不改变默认实现,可以定义访问器而不定义其实现
//2.可变属性var,类型 Int、默认 getter 和 setter  
var initialized = 1 
//2.只读属性val,类型 Int 、默认 getter
val inferredType = 1 
//3.自定义访问器getter和setter,按照惯例setter参数的名称是value
var stringRepresentation: String
    get() = this.toString()
    set(value) {
        setDataFromString(value) // 解析字符串并赋值给其他属性
    }
//4.此 setter 是私有的并且有默认实现,用 Inject 注解此 setter
var setterVisibility: String = "abc"
    private set 
var setterWithAnnotation: Any? = null
    @Inject set 
  1. Kotlin不能有字段,当使用自定义访问器时,有一个幕后字段有时是有必要的,通过field标识符访问;
var counter = 0
  set(value) {
    if (value >= 0)
      //5.此初始器值直接写入到幕后字段,field标识符智能在属性的访问器内
      field = value
  }

三、编译期常量


  1. 已知值的属性可以使用const修饰符标记为编译期常量,属性要位于顶层或者object的一个成员,用String或原生类型初始化没有自定义getter
const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
@Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { …… }

四、延迟初始化属性


  1. 一般地,属性声明为非空类型必须在构造函数初始化,然而通过依赖注入初始化,或者单元测试setup方法初始化时经常不方便;
  2. 使用lateinit修饰符标记该属性,只能用于在类体中声明的var属性,当且仅当属性没自定义getter或setter时,属性必须是非空类型,并且不能是原生类型
public class MyTest {
    lateinit var subject: TestSubject
    @SetUp fun setup() {
        subject = TestSubject()
    }
    @Test fun test() {
        subject.method()  // 直接解引用
    }
}

1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)

1024工场服务号
1024工场服务号

2.加入“Kotlin开发”QQ讨论群,一起学习一起Hi。(甭客气!尽情的扫描或者长按!)
Kotlin开发群
Kotlin开发群

本文来自:简书

感谢作者:1024工场

查看原文:Kotlin:可变或者不可变的属性的使用

100 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet