吸毒者和安置者在Kotlin

例如,在Java中,我可以自己编写getter(由IDE生成),也可以在lombok中使用@Getter之类的Annotations – 这非常简单。

但是Kotlin 默认有getter和setter 。 但我不明白如何使用它们。

我想说的是,可以说 – 类似于Java:

private val isEmpty: String get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility. 

那么吸气剂如何工作呢?

Getter和Setter是在Kotlin中自动生成的。 如果你写:

 val isEmpty: Boolean 

它等于下面的Java代码:

 private final Boolean isEmpty; public Boolean isEmpty() { return isEmpty; } 

在你的情况下,私人访问修饰符是多余的 – isEmpty默认是私有的,只能由getter访问。 当你试图获得你的对象的isEmpty属性,你实际上调用get方法。 为了更多的了解Kotlin中的getter / setter:下面的两个代码示例是相等的:

 var someProperty: String = "defaultValue" 

 var someProperty: String = "defaultValue" get() = field set(value) { field = value } 

另外我想指出的是, this是一个getter不是你的财产 – 这是类实例。 如果你想访问getter或setter中的字段值,你可以使用保留字field

 val isEmpty: Boolean get() = field 

如果您只想在公共访问中使用get方法 – 您可以编写以下代码:

 var isEmpty: Boolean private set 

由于set访问器附近的私有修饰符,只能在对象内的方法中设置此值。

有关属性访问器可见性修饰符的规则如下:

  • varval属性的getter可见性应该与属性的可见性完全相同,因此只能显式复制属性修饰符,但它是多余的:

     protected val x: Int protected get() = 0 // No need in `protected` here. 
  • var property的setter可见性应该与property的可见性相同或更小

     protected var x: Int get() = 0 private set(x: Int) { } // Only `private` and `protected` are allowed. 

在Kotlin中,属性总是通过getter和setter来访问,因此不需要像Java那样使用public访问器来private属性 – 它的后台(如果存在的话)已经是私有的。 因此,属性访问器上的可见性修饰符仅用于使setter可见性更宽松:

  • 对于具有后台字段和默认访问者的属性:

     var x = 0 // `public` by default private set 
  • 对于没有后台的属性:

     var x: Int // `public` by default get() = 0 protected set(value: Int) { } 

kotlin中的Getter默认是公共的,但是您可以将setter设置为private,并通过在类中使用一个方法来设置值。 喜欢这个。

 /** * Created by leo on 17/06/17.*/ package foo class Person() { var name: String = "defaultValue" private set fun foo(bar: String) { name = bar // name can be set here } } fun main(args: Array) { var p = Person() println("Name of the person is ${p.name}") p.foo("Jhon Doe") println("Name of the person is ${p.name}") } 

你可以看到这个教程的更多信息:

另一个Android开发者的Kotlin教程

属性

在Kotlin的世界里,类不能有字段,只有属性。 var关键字告诉我们该属性是可变的,而不是val。 我们来看一个例子:

 class Contact(var number: String) { var firstName: String? = null var lastName: String? = null private val hasPrefix : Boolean get() = number.startsWith("+") } 

没有太多的代码,但幕后发生了很多事情。 我们将一步一步的通过。 首先,我们创建了一个公开的最终课程联系人。

这是我们必须面对的主要规则:如果没有另外指定,默认情况下类是public和final(顺便说一下,类方法也是如此)。 如果你想从类inheritance,用open关键字标记。