2016-06-19 10 views
25

In Java zum Beispiel kann ich Getter selbst schreiben (generiert von IDE) oder Annotationen wie @Getter in Lombok verwenden - was ziemlich einfach war.Getters und Setter in Kotlin

Kotlin hat jedoch getters and setters by default. Aber ich kann nicht verstehen, wie man sie benutzt.

ich es machen wollen, sagen wir mal - ähnlich wie Java:

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

So wie Getter arbeiten?

Antwort

45

Getters und Setter werden automatisch in Kotlin generiert. Wenn Sie schreiben:

val isEmpty: Boolean 

Es ist gleich dem folgenden Java-Code:

private final Boolean isEmpty; 

public Boolean isEmpty() { 
    return isEmpty; 
} 

In Ihrem Fall der private Zugriffsmodifikator ist redundant - isEmpty standardmäßig privat und kann nur durch einen Getter zugegriffen werden . Wenn Sie versuchen, die isEmpty-Eigenschaft Ihres Objekts abzurufen, rufen Sie die get-Methode in real auf. Für mehr Verständnis von Getter/Setter in Kotlin: die beiden Codebeispiele unten sind gleich:

var someProperty: String = "defaultValue" 

und

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

auch darauf hin, ich will, dass this in einem Getter nicht Ihr Eigentum ist - es ist die Klasseninstanz. Wenn Sie den Zugriff auf den Wert des Felds in einem Getter erhalten möchten oder Setter können Sie das reservierte Wort field dafür verwenden:

val isEmpty: Boolean 
    get() = field 

Wenn Sie nur eine get-Methode in der Öffentlichkeit Zugang haben wollen - Sie diesen Code schreiben :

aufgrund des privaten Modifier in der Nähe des Set-Accessor können Sie diesen Wert nur in Methoden innerhalb Ihres Objekts festlegen.

+5

'In Ihrem Fall ist der private Zugriffsmodifikator redundant. Wie? Der Standardmodifikator von Kotlin Doc ist öffentlich. https://kotlinlang.org/docs/reference/visibility-modifiers.html –

+0

@Nichts ja es scheint wie öffentliches Feld, aber unter der Haube rufen Sie Getter-Methode – Cortwave

+0

Die 'val isEmpty: Boolean' wird nicht kompilieren, wie isEmpty noch nicht ist initialisiert, oder? Fange gerade an, Kotlin zu lernen. Was passiert mit 'get() = field'? –

12

Die Regeln über Eigenschaftenaccessoren visibility modifiers sind die folgenden:

  • Getter Sichtbarkeit von var und val Eigenschaft sollte genau die gleiche auf die Sichtbarkeit des Objekts sein, so können Sie nur die Eigenschaft explizit duplizieren Modifizierungsmittel, aber es ist redundant:

    protected val x: Int 
        protected get() = 0 // No need in `protected` here. 
    
  • Setter Sichtbarkeit von var propert y sollte gleich oder weniger permissiven als die Eigenschaft Sichtbarkeit sein:

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

In Kotlin, Eigenschaften werden immer durch Getter und Setter zugegriffen wird, so gibt es keine Notwendigkeit, eine Eigenschaft private mit public Accessoren bei der Herstellung wie in Java - its backing field (if present) ist bereits privat.So Sichtbarkeitsmodifizierer auf Eigenschaftenaccessoren sind nur machen Setter Sicht weniger permissiven verwendet:

  • Für eine Eigenschaft mit Unterstützung Feld und Standardzugriffs:

    var x = 0 // `public` by default 
        private set 
    
  • Für eine Eigenschaft, ohne dahinter liegende Feld:

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

Getter in Kotlin ist standardmäßig öffentlich, aber Sie können festlegen Setzen Sie den Setter auf private und legen Sie den Wert fest, indem Sie eine Methode in einer Klasse verwenden. So was.

/** 
* 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<String>) { 
    var p = Person() 
    println("Name of the person is ${p.name}") 
    p.foo("Jhon Doe") 
    println("Name of the person is ${p.name}") 
} 
3

Sie dieses Tutorial für weitere Informationen sehen:

Yet Another Kotlin Tutorial for Android Developers

Eigenschaften

In Kotlin Welt können Klassen keine Felder haben, nur Eigenschaften. var keyword sagt uns die Eigenschaft ist veränderlich, im Gegensatz zu val. Lassen Sie uns ein Beispiel sehen:

class Contact(var number: String) { 

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

} 

Es gibt nicht viel Code, aber viele Dinge sind passiert hinter den Kulissen . Wir werden Schritt für Schritt durchgehen. Als allererstes haben wir eine public final class Contact erstellt.

Dies ist die primäre Regel, die wir zu bewältigen haben: Wenn nicht anders angegeben, Klassen sind öffentlich und endgültig durch Standard (übrigens ist das gleiche für Klassenmethoden). Wenn Sie von der Klasse erben möchten, markieren Sie sie mit dem Schlüsselwort .