吸毒者和安置者在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访问器附近的私有修饰符,只能在对象内的方法中设置此值。
有关属性访问器可见性修饰符的规则如下:
-
var
和val
属性的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关键字标记。