Scala Grundkurs

Konstruktoren und Initialisierung

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Konstruktoren in Scala werden auf die Ebene des Klassennamens abgebildet und bringen dabei einige Besonderheiten beim Zugriff auf die Parameter mit sich.

Transkript

Im Normalfall ist die gesamte Klassendefinition ein einziger Konstruktor. Dementsprechend gibt es einige Besonderheiten zu beachten, beim Arbeiten mit Konstruktoren und Scala-Klassen. Ich zeige Ihnen nun, welche das im Einzelnen sind. Ich befinde mich nun also in meiner Applikation. In dieser Applikation gibt es einen Warenkorb, Preise, Produkte, einen Online-Shop und Kunden. Bis jetzt werden Kunden immer anhand ihres Vornamen und Nachnamen initialisiert. Das bedeutet, für einen normalen Konstruktor wären das die beiden Argumente. Zusätzlich gibt es aktuell noch eine Factory-Methode, die ich nun kurzerhand deaktiviere. Aufgrund dessen benötige ich nun wieder das "new"-Keyword, um einen "Customer" zu erzeugen. Ein Problem meines Customer aktuell, dass man nicht den Vornamen und Nachnamen abrufen kann, obwohl diese Argumente in den Konstructor des Customer hineinfließen. Um "firstname" und "lastname" sichtbar zu machen, muss ich ähnlich wie bei "Gettern" in Java zunächst einmal eine Definition vornehmen. In dem Fall reicht es also, das Keyword "val" vor "firstname" und "lastname" zu setzen. Damit kann ich nun auf Basis des Customer bspw. den Vornamen auf die Konsole ausgeben. Nun könnte ich auch noch weitere Argumente hinzufügen, beispielsweise das Alter. Dieses ist nun vom Typ "int", und ich möchte, dass man das Alter später ändern kann. Das bedeutet bspw. wenn eine Person älter wird, möchte man das Alter dieser Person anpassen. Statt "val" verwende ich also nun "var", um eine Variable zu definieren. Diese hat also auch einen so genannten "Setter", um den Wert von "age" später ändern zu können. Innerhalb der Argumente des Konstruktors habe ich auch noch die Möglichkeit, ein vordefiniertes Argument zu belegen. Beispielsweise könnte ich sagen, dass "gender" standardmäßig mit "male" belegt ist. Wenn nun also jemand eine Instanz von Customer erzeugen möchte, muss er nicht unbedingt "gender" angeben. Ich kann nun also das Alter nehmen und auf die Konsole ausgeben. Daraufhin kann ich das Alter verändern, bspw. auf 26, und das Alter noch einmal ausgeben. Diese Art von Feldzugriff ist nicht unbedingt die schönste Art und Weise, mit Feldern auf Klassen zu arbeiten. Aus genau diesem Grund kann man auch ähnlich wie in Java echte "Getter" und "Setter" bestimmen. Dafür verändere ich nun kurzerhand die Definition von "age", und mit Hilfe von Refactoring benenne ich diese Variable nun um in "initialAge". Dies steht also nun für das Alter, das initial beim Erstellen des Customers verwendet wird. Ich kann nun eine interne private Variable definieren, die ich "_age" nenne. Diese trägt den Wert "initialAge". Auf meiner "Application.scala" habe ich nun das Problem, dass man das Alter nicht mehr abrufen kann. Das heißt, zunächst einmal definiere ich also die Möglichkeit, das Alter abzurufen, mit einer Funktion "age", die "_age" zurückgibt. Wenn ich nun also einen "Setter" haben möchte, benötige ich eine etwas besondere Notation. Dafür definiere ich nun "age_", nehme hier einen Wert in Form eines "int" entgegen, und die Implementierung von diesem Code ist dann, dass meinem Felder "_age" der Wert zugewiesen wird. So habe ich es nun geschafft, eigene Methoden bzw. Funktionen dafür zu definieren, dass man mit der "age"-Variable arbeiten kann. Außerdem kann ich die Parametrisierung beim Erstellen meiner Customer-Klasse deutlich erkennbarer machen, indem ich bspw. Felder zuweise. So kann ich explizit sagen, dass das Argument "firstname" "Christopher" ist. Und das zweite Argument "lastname = "Janietz"". Genau so kann ich das Alter mit seinem Feldnamen belegen, und wenn ich es wünschen würde, könnte ich nun auch noch "gender" mit seinem Feldnamen belegen. Das Besondere an dieser Notation ist nun, dass, sollte sich jemals die Reihenfolge der Argumente ändern, so muss an dieser Implementierung nichts mehr verändert werden. Denn sie ist unabhängig von der Stellung der Argumente. Betrachtet man nun noch einmal die Klasse "Customer", so ist der gesamte Inhalt, der sich in diesem Block befindet, wie ein Konstruktor zu betrachten, da hier an verschiedenen Stellen immer Zuweisungen passieren. Da es sich hier also nun um einen Konstruktor handelt, kann ich auch beliebige Logik ausführen, beispielsweise auf die Konsole schreiben, wie der Hinweis, dass der Customer erstellt wurde. Auf genau diesen Prinzipien basieren nun also auch die verschiedenen Konstanten, die hier initialisiert werden. Diese können auf Basis der Eingabeargumente also berechnet werden. Üblicherweise schreibt man allerdings keinen prozeduralen Code in den Konstructor, also die Klasse selbst, sondern im Normalfall definiert man eine private Methode mit der Bezeichnung "init", kopiert dort relevanten Code rein, der extra stehen müsste, und ruft zu guter Letzt nur noch diese Methode "init" auf. So lassen sich also bspw. Konstruktoren mit erweiterter Logik abbilden. Ich habe Ihnen also vordefinierte und benannte Argumente im Zusammenhang mit Konstruktoren gezeigt. Des Weiteren habe ich zum Schluss mit Ihnen eine init-Methode erstellt, um zu vermeiden, dass prozeduraler Code innerhalb des Klassenkonstruktors stehen muss.

Scala Grundkurs

Entdecken Sie die Möglichkeiten und Eigenschaften der modernen Programmiersprache Scala.

4 Std. 44 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:12.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!