Sekundäre Konstruktionssyntax kotlin

8

Ich habe die folgende Kotlin-Klasse mit einem primären Konstruktor,

%Vor%

Ich möchte einen sekundären Konstruktor hinzufügen, der einen vollständigen Namen in den Namen first und last zerlegt und den primären Konstruktor aufruft. Allerdings kann ich die Syntax nicht richtig machen ...

%Vor%

Das funktioniert gut, weil ich fullname im sekundären Konstruktor nicht analysiere. Wenn ich fortfahre und versuche, Fullname zu analysieren,

%Vor%

Ich bekomme eine ungelöste Referenz: fullname. Es existiert nicht im Bereich, aber wenn ich es in die geschweiften Klammern stecke, kann ich den primären Konstruktor nicht über this ,

aufrufen %Vor%

Ich erhalte eine Fehlermeldung mit einer fehlenden Funktion invoke .

Ich kann kein gutes Beispiel für diesen Fall in Kotlin-Dokumenten finden, sorry.

    
Adam Hughes 13.02.2017, 16:02
quelle

2 Antworten

2

Die Lösung, die ich benutze, wenn ich einen sekundären Konstruktor haben möchte, der einige Berechnungen vor dem Übergeben der Ergebnisse an den primären Konstruktor ausführen muss, ist eine Funktion für das Begleitobjekt. Der Code dafür würde wie folgt aussehen:

%Vor%

Sie können es dann so verwenden

%Vor%

Was nicht so sauber ist wie Person("John Doe", 27) , aber IMO ist nicht zu schlecht.

    
Michael Anderson 15.02.2017, 07:08
quelle
1

Konstruktoraufrufe über this müssen der erste Aufruf sein. Deshalb wird es als Delegat und nicht als normaler Methodenaufruf behandelt. Das bedeutet, dass Sie Variablen nicht deklarieren können, bevor der Aufruf delegiert wird.

Sie können dies lösen, indem Sie einfach die Werte eingrenzen, die Sie beim Speichern in Variablen geplant haben:

%Vor%

Aber dies kann potenziell außerhalb der Grenzen indexieren, wenn kein Nachname angegeben wurde oder wenn der Client sich entschieden hat, - oder ein anderes Zeichen als Trennzeichen zu verwenden. Darüber hinaus ist es ein Auge wund.

Entwurfsanalyse

Das Problem mit Ihrer Struktur besteht darin, der Klasse Person die Verantwortung zu geben, den Vor- und Nachnamen zu bestimmen. Dies verschlechtert die Wiederverwendbarkeit dieser Klasse, da sie auf eine Form des Parsens beschränkt ist. Aus diesem Grund sollte das Parsen von Namen nicht von Person ausgeführt werden.

Stattdessen sollten Sie Ihren primären Konstruktor anzeigen und dann den Client von Person den Vor- und Nachnamen trennen lassen.

Lösungsbeispiel

Stellen Sie sich vor, wir lesen Namen aus einer Datei. Jede Zeile in der Datei besteht aus einem vollständigen Namen.

%Vor%

Dies ist der Luxus, den Sie Ihren Kunden bieten wollen: erlauben Sie ihnen, einfach einen Namen einzugeben, ohne sich um das Parsen zu kümmern.

Das Problem dabei ist die mangelnde Sicherheit: Was wäre, wenn die Linie nur einen Vornamen hätte? Was ist, wenn die Datei keinen Leerzeichen verwendet, um Vor- und Nachnamen zu trennen? Sie wären gezwungen, neue Person -Typen zu definieren, nur um verschiedene Kombinationen aus Vor- und Nachnamen zu behandeln.

Stattdessen sollte das Parsing außerhalb der Klasse erfolgen:

%Vor%

Nachdem nun die Verantwortung aus Person herausgenommen wurde, können wir einem neuen Objekt die Verantwortung übertragen, wenn wir wollten:

%Vor%     
Vince Emigh 13.02.2017 17:56
quelle

Tags und Links