2016-06-19 13 views
25

W Javie, na przykład, mogę samodzielnie pisać napisy (generowane przez IDE) lub używać Adnotacji takich jak @Getter w lombok - co było całkiem proste.Getters and Setters w Kotlin

Kotlin ma jednak getters and setters by default. Ale nie mogę zrozumieć, jak z nich korzystać.

chcę zrobić to, powiedzmy, że - podobnie jak Java:

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

Więc jak getters działa?

Odpowiedz

45

Przeciągi i setery generowane są automatycznie w Kotlin. Jeśli piszesz:

val isEmpty: Boolean 

Jest równa następującego kodu Java:

private final Boolean isEmpty; 

public Boolean isEmpty() { 
    return isEmpty; 
} 

W twoim przypadku prywatnej modyfikator dostępu jest zbędny - isEmpty jest domyślnie prywatne i mogą być dostępne tylko przez getter . Gdy próbujesz uzyskać właściwość isEmpty obiektu, którą wywołujesz metodę get w rzeczywistości. Aby uzyskać więcej zrozumienia pobierające/ustawiające w Kotlin: Poniżej dwa przykłady kodu są równe:

var someProperty: String = "defaultValue" 

i

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

Również chcę podkreślić, że this w getter nie jest twoja własność - to instancja klasy. Jeśli chcesz uzyskać dostęp do wartości pola w getter lub setter można użyć słowa zastrzeżonego field do niego:

val isEmpty: Boolean 
    get() = field 

jeśli tylko chcą mieć sposób dostać się w publicznym dostępie - można napisać ten kod :

var isEmpty: Boolean 
    private set 

ze względu na prywatny modyfikator w pobliżu ustawionego akcesora można ustawić tę wartość tylko w metodach wewnątrz obiektu.

+5

'W twoim przypadku modyfikator dostępu prywatnego jest zbędny" Jak? Domyślny modyfikator słowa Kotlin doc jest jawny. https://kotlinlang.org/docs/reference/visibility-modifiers.html –

+0

@Nothing tak wygląda pole publiczne, ale pod maską nazywasz metodę getter – Cortwave

+0

'val isEmpty: Boolean' nie będzie się kompilować, ponieważ isEmpty nie jest jeszcze zainicjalizowane, prawda? Właśnie zaczyna się uczyć Kotlina. Co się dzieje z 'get() = field'? –

12

Zasady dotyczące własności dostępowe visibility modifiers są następujące:

  • widoczność Getter z var i val własności powinny być dokładnie samo do widoczności nieruchomości, więc można tylko wyraźnie powielać właściwość modyfikator, ale jest zbędny:

    protected val x: Int 
        protected get() = 0 // No need in `protected` here. 
    
  • widoczność Seter z var propert y powinny być samo lub mniej liberalne niż widoczności własności:

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

W Kotlin, właściwości są zawsze dostępne za pośrednictwem getter i setter, a tym samym nie ma potrzeby w tworzeniu własności private z public dostępowych, takich jak w języku Java - its backing field (if present) jest już prywatny.Tak, modyfikatory widoczność udostępniające właściwości są wykorzystywane tylko do widoczności seter mniej liberalne:

  • Dla nieruchomości z polem podkład i fabrycznych akcesorów:

    var x = 0 // `public` by default 
        private set 
    
  • Dla nieruchomości bez pola podkładowej:

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

Getter w Kotlin jest domyślnie publiczności, ale można ustawić setera do prywatnego i ustawić wartość za pomocą jednej metody w klasie. Lubię to.

/** 
* 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

Można zobaczyć ten poradnik, aby uzyskać więcej informacji:

Yet Another Kotlin Tutorial for Android Developers

Właściwości

W Kotlin świata, zajęcia nie mogą mieć pola, tylko właściwości. var słowo kluczowe mówi nam, że właściwość jest zmienna, w przeciwieństwie do val. Załóżmy zobaczyć przykład:

class Contact(var number: String) { 

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

} 

Nie ma dużo kodu, ale wiele rzeczy dzieją się za scen. Przejdziemy przez to krok po kroku. Przede wszystkim utworzyliśmy publiczną końcową klasę kontaktu .

Jest to podstawowa zasada musimy się zmierzyć: jeśli nie podano inaczej, klasy są publiczne i ostateczna domyślnie (nawiasem mówiąc, to samo dla metod klasy). Jeśli chcesz dziedziczyć po zajęciach, zaznacz go słowem kluczowym open .