2017-05-29 2 views
1

Ich weiß es nicht „streng von dem Design-Muster“ bla bla bla, aber ...Kotlin: Ein Standard-ish Setter, die zurückgibt „die“

In Kotlin, gibt es eine Möglichkeit, eine „default zu erstellen ish“Setter, die gibt‚this‘, wie

var foo:Bar = Something() 
    set(f:Bar) { 
     foo = f 
     return this // Alas, that would not compile because Setter returns Unit 
    } 

Es ist sehr praktisch, wenn ein Setter zurückkehren this, weil dann ein Builder-Muster einen Builder zu erklären, ohne machen. Es ist nur kürzer zu tun:

BlahBlah().setFoo(x).setFoo2(y)... 

als

BlahBlah.Builder().setFoo(x).... 

oder

var b = BlahBlah() 
b.setFoo(x) 
b.setFoo2(y) 
... 

oder was auch immer

Und außerdem, wenn ein Setter gibt Unit sowieso, warum nicht this wie Gut?

+0

Nein, nicht wirklich. In diesem Fall handelt es sich um Standard-Accessoren. – Meymann

+0

Diese sind auch in den Antworten enthalten. – zsmb13

Antwort

6

Kotlin hat schöne documentation on how to create type safe builders. Die Setter in Kotlin als

aufgerufen
receiver.property = value 

Rückkehr this aus der Setter-Methode nur im Fall helfen würde, wird der Code von Java verwendet. Nachdem gesagt wurde, dass ein Kotlin-Setzer Unit zurückgeben muss. Auch ohne spezielle Bauer eine typische Aufgabe für ein Objekt mehrere Eigenschaften der Einstellung ist viel prägnanter in Kotlin:

class BlahBlah { 
    var name = "John" 
    var age = 12 
} 

BlahBlah().apply { 
    name = "Sarah" 
    age = 10 
} 
+0

... Und der große Teil, alles im Anwendungsblock wird von "diesem" empfangen. Sie können sogar Methoden aufrufen! val coolText = Textansicht (Kontext).Anwenden {text = "moo"; textSize = TSIZE; animate (myCoolAnimation);} Um es zusammenzufassen: Warum benutzt man einen VW der 1950er Jahre, als man einen brandneuen Maserati bekam? anwenden ist viel mächtiger als alte Java Builder-ish-Setter. – Meymann

1

Nein, das ist nicht möglich: Kotlin der Setter Einheit nach Design zurückzukehren.

Das Builder-Muster existiert, um das Problem zu lösen, bei dem die Zunahme von Konstruktorparameterkombinationen zu einer Exponentialliste von Konstruktoren führt. In Kotlin dieses Problem, indem Standard-Parameterwerte gelöst:

data class Foo(
    val a1: String = "a1", 
    val a2: String = "a2" 
) 

Statt die Builder-Muster zu verwenden, können Sie jetzt einfach Parameter überspringen, indem sie die Benennung:

val foo = Foo(a1 = "bar") 

Wenn Sie wirklich haben wollen eine Art Builder:

class FooBuilder { 
    var a1: String = "a1" 
    var a2: String = "a2" 

    fun build() = Foo(a1, a2) 
} 

val foo = FooBuilder().apply { 
    a1 = "bar" 
}.build() 

Allerdings erfordert dies viel mehr Code.

+0

Das Problem ist hauptsächlich von Java. Altes frustrierendes Java ... Weil ich Tonnen von Code habe, möchte ich langsam migrieren. Kotlin hat das wunderbar gemacht. Es ist nur das alte Java, das nervt. – Meymann

2

Bitte nehmen Sie sich einen Blick auf How to implement Builder pattern in Kotlin?

Es ist kein eingebauten Mechanismus ist, aber Sie können Sie apply nutzen Selbst Rückkehr Methoden leicht zu schreiben:

class Foo { 
    var bar: Bar 
    fun bar(b: Bar) = apply { bar = b } 
} 
+0

Schöne Konvention. Solange Sie nicht vergessen, es als eine Methode, nicht als Eigentum Zugang zu verwenden. Aber es hat mir gefallen. – Meymann

Verwandte Themen