[kotlin系列] (s2_2)属性、字段、接口、可见性修饰

来源:互联网 发布:原生js 双向绑定 编辑:程序博客网 时间:2024/05/22 13:52

属性和字段见这里

声明一个属性的完整语法:

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 不能引入静态方法了。替代方案是直接将方法定义在包做顶层声明。

原创粉丝点击