声明一个属性的完整语法:
var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]
如果就是单纯的setter和getter(例如POJO类),那么直接定义变量(常量,常量没有setter、默认getter)就好了,如果有特殊的逻辑才需要写。
e.g.
val isEmpty: Boolean
get() = this.size == 0
一个自定义的 setter 的例子:
var stringRepresentation: String
get() = this.toString()
set(value) {
setDataFromString(value) // 解析字符串并赋值给其他属性
}
进阶:如果你需要改变一个访问器的可见性或者对其注解,但是不需要改变默认的实现, 你可以定义访问器而不定义其实现:
var setterVisibility: String = "abc"
private set // 此 setter 是私有的并且有默认实现
var setterWithAnnotation: Any? = null
@Inject set // 用 Inject 注解此 setter
关于字段的内容见原始文档
接口原始文档在这里
接口类似Java8
可以提供函数的默认实现,上一节中我们说到过这一点。尤其是同名函数复写消除歧义。
有一点比较重要:
在Java中,我们可能将一些常量定义在接口中,尤其是接口中所定义的方法的参数,往往这些参数定义到枚举过于“代价高昂”,定义到某个实现类中可能也不太合适。但现在:
可以在接口中定义属性。在接口中声明的属性要么是抽象的,要么提供访问器的实现。
在接口中声明的属性不能有幕后字段(backing field),因此接口中声明的访问器不能引用它们。
interface MyInterface {
val prop: Int // 抽象的
val propertyWithImplementation: String
get() = "foo"
fun foo() {
print(prop)
}
}
class Child : MyInterface {
override val prop: Int = 29
}
在 Kotlin 中有这四个可见性修饰符:private、 protected、 internal 和 public。 如果没有显式指定修饰符的话,默认可见性是 public。
类、对象、接口、构造函数、方法、属性和它们的 setter 都可以有 可见性修饰符。 (getter 总是与属性有着相同的可见性。)
- private、protected ,public和Java一致
- 多了一个internal。
- Java不声明默认的default为包内,kotlin默认public
摘录一下:
可见性修饰符 internal 意味着该成员只在相同模块内可见。更具体地说, 一个模块是编译在一起的一套 Kotlin 文件:
- 一个IntelliJ IDEA 模块;
- 一个 Maven 项目;
- 一个 Gradle 源集;
- 一次 <kotlinc> Ant 任务执行所编译的一套文件。
另外之前有提到:import 不能引入静态方法了。替代方案是直接将方法定义在包做顶层声明。