CodeGym /Java-Blog /Random-DE /Java-Konstrukteure - Warum sind wir auf der Suche nach Ko...
John Squirrels
Level 41
San Francisco

Java-Konstrukteure - Warum sind wir auf der Suche nach Konstrukteuren?

Veröffentlicht in der Gruppe Random-DE
Coucou! Heute sind wir alle an einem sehr wichtigen Thema interessiert, das unsere Objekte betrifft. Ohne Übertreibung, wir glauben, dass Sie dieses Thema in den letzten Tagen verwenden würden! Unsere Java - Konstrukteursbeiträge . Es kann sein, dass die Premiere so lange dauert, bis Sie von den Konstrukteuren in Anspruch genommen werden. Das ist alles einfach nicht realisierbar :) Wir haben uns erst spät überzeugt. Java-Konstrukteure - Warum sind wir auf der Suche nach Konstrukteuren?  - 1

Was sind das und warum ist es nicht nötig?

Prenons deux Beispiele.
public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

       Car bugatti = new Car();
       bugatti.model = "Bugatti Veyron";
       bugatti.maxSpeed = 378;

   }
}
Wir haben unser Auto erfunden und definitiv sein Modell und seine maximale Geschwindigkeit. Das Objekt Car wurde jedoch nicht als 2-Champion in einem echten Projekt angesehen. Zum Beispiel, es geht um 16!
public class Car {

   String model;// modèle
   int maxSpeed;// vitesse maximale
   int wheels;// largeur de roue
   double engineVolume;// volume du moteur
   String color;// couleur
   int productionYear;// année de production
   String ownerFirstName;// prénom du propriétaire
   String ownerLastName;// nom du propriétaire
   long price;// prix
   boolean isNew;// indicateur pour savoir si la voiture est neuve
   int seatsInTheCar;// nombre de sièges dans la voiture
   String cabinMaterial;// matériau de l'intérieur
   boolean insurance;// indicateur pour savoir si la voiture est assurée
   String manufacturerCountry;// pays du constructeur
   int trunkVolume;// taille du coffre
   int accelerationTo100km;// le temps pour accélérer à 100 km/h (en secondes)


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "bleu";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italie";
       bugatti.ownerFirstName = "Amigo";
       bugatti.productionYear = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.seatsInTheCar = 2;
       bugatti.maxSpeed = 378;
       bugatti.model = "Bugatti Veyron";

   }

}
Wir haben ein neues Autoobjekt geschaffen . Aber ich habe ein Problem: Wir haben 16 Champs, aber wir haben noch keine 12 Champs initialisiert ! Schauen Sie sich die Code-Wartung und den Aufsatz an, um die Experten zu finden, die wir herausgefunden haben! Das ist doch einfach, oder? In dieser Situation kann es einem Programmierer leicht fallen, einen Fehler zu machen und bestimmte Champions zu initialisieren. Folglich muss das Programm nicht korrigiert werden:
public class Car {

   String model;// modèle
   int maxSpeed;// vitesse maximale
   int wheels;// largeur de roue
   double engineVolume;// volume du moteur
   String color;// couleur
   int productionYear;// année de production
   String ownerFirstName;// prénom du propriétaire
   String ownerLastName;// nom du propriétaire
   long price;// prix
   boolean isNew;// indicateur pour savoir si la voiture est neuve
   int seatsInTheCar;// nombre de sièges dans la voiture
   String cabinMaterial;// matériau de l'intérieur
   boolean insurance;// indicateur pour savoir si la voiture est assurée
   String manufacturerCountry;// pays du constructeur
   int trunkVolume;// taille du coffre
   int accelerationTo100km;// le temps pour accélérer à 100 km/h (en secondes)


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "bleu";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italie";
       bugatti.ownerFirstName = "Amigo";
       bugatti.productionYear = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.seatsInTheCar = 2;
       bugatti.maxSpeed = 378;
       bugatti.model = "Bugatti Veyron";

       System.out.println("Modèle : Bugatti Veyron. Volume du moteur : " + bugatti.engineVolume + ". Volume du coffre : " + bugatti.trunkVolume + ". Matériau d'intérieur : " + bugatti.cabinMaterial +
       ". Largeur de roue : " + bugatti.wheels + ". Achetée en 2018 par M. " + bugatti.ownerLastName);

   }

}
Konsolentyp:
Modell: Bugatti Veyron. Motorlautstärke: 6,3. Inhalt des Koffers: 0. Innenmaterial: null. Größere Anzahl: 0. Erfolgt im Jahr 2018 von M. null
Ihr Kunde, der 2 Millionen Dollar für sein Auto braucht, ist offensichtlich nicht über den Inhalt hinaus, den er als „ M. null “ bezeichnen würde! Mehr noch, die Idee besteht darin, dass wir ein falsches Objekt erstellen: ein Auto mit einer größeren Entfernung von 0 (es liegt nicht an allen Routen), ein Koffer, eine fertige Kabine. Ein unbekanntes Material und darüber hinaus ein unbestimmter Eigentümer. Sie können sich leicht vorstellen, einen Kommentar abzugeben und einen Fehler zu erkennen, der das Programm während der Ausführung „entgleisten“ könnte! Wir müssen uns auf die Situation konzentrieren, die auf einer Art oder Weise oder in einem anderen Fall auftritt. Wir haben unser Programm zurückgehalten: Als wir ein neues Autoobjekt erschaffen haben , wollen wir, dass die Champions wie das Modell und die maximale Leistung sind.spezifiziert. Sinon, wir empören uns über die Schaffung des Objekts. Die Konstrukteure haben diese Maschine mit Einrichtungen ausgestattet. Es deutet darauf hin, dass es sich um eine gute Daseinsberechtigung handelt. Der Java-Konstrukteur hat eine Art „Squelette“-Klasse erstellt, von der jedes neue Objekt konform ist. Für ein Plus an Komfort und Komfort in der Version „Plus Simple Car Classe “ mit zwei Champions. Berücksichtigen Sie unsere Anforderungen und den Konstrukteur der Klasse, der diesem entspricht:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}

// Et la création d'un objet ressemble maintenant à ceci :

public static void main(String[] args) {
   Car bugatti = new Car("Bugatti Veyron", 378);
}

Der Java-Konstrukteur

Beachten Sie, dass der Kommentar eines Konstrukteurs deklariert ist . Es ähnelt einer gewöhnlichen Methode, aber es fehlt die Art der Rücksendung. Darüber hinaus spezifizierte der Konstrukteur den Klassennamen ( Car ) in Anlehnung an einen Majuskelbuchstaben. Darüber hinaus wird der Java-Konstrukteur mit einem Schlüssel verwendet, der neu für mich ist: this . Der Grund hierfür liegt darin, ein bestimmtes Objekt anzuzeigen. Der Code des Konstrukteurs
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
Möglicherweise muss ich es für meinen Zweck interpretieren: „Das Modell dieses Fahrzeugs (das wir nicht kennen) ist das Modellargument, das beim Konstrukteur verloren gegangen ist.“ Die maximale Geschwindigkeit dieses Fahrzeugs (die wir nicht kennen) ist das Argument maxSpeed, das vom Hersteller übernommen wurde. » Und das ist genau das, was passiert ist:
public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car("Bugatti Veyron", 378);
       System.out.println(bugatti.model);
       System.out.println(bugatti.maxSpeed);
   }

}
Konsolentyp:
Bugatti Veyron 378
Der Konstrukteur hat einen guten Einfluss auf die erforderlichen Werte. Vielleicht ist Ihnen aufgefallen, dass ein Konstrukteur einer gewöhnlichen Methode sehr ähnlich ist! Und das ist alles klar. Ein Konstrukteur ist eine Methode, nur mit spezifischen Funktionen :) Alles zusammen mit den Methoden, wir müssen die Argumente an unseren Konstrukteur übermitteln. Und genau wie bei einer Methode muss ein Konstrukteur keine Funktion haben, die Sie nicht spezifiziert haben:
public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car(); // Erreur !
   }

}
Sie sehen vielleicht, dass der Konstrukteur uns dabei unterstützt hat, unsere ersten Versuche zu machen. Warten Sie, Sie können nicht mehr ein Auto ohne Vitesse oder Modell erschaffen! Die Ähnlichkeit zwischen den Konstrukteuren und den Methoden lässt sich nicht erreichen. Trotz der Methoden können die Konstrukteure zusätzliche Kosten verursachen . Stellen Sie sich vor, Sie wären zwei Familienmitglieder. Du bist ein Depuis, der ein Chatton ist. Aber Sie adoptierten das Zweite in der Straße, als es erwachsen wurde, und Sie wussten nicht, wie lange es dauerte. In diesem Fall möchten wir, dass unser Programm genau zwei Arten von Chats erstellt: Wer einen Namen und ein Alter hat (für den ersten Chat), und wer nicht gerade einen Namen hat (für den zweiten Chat) . Aus diesem Grund berechnen wir für den Konstrukteur folgende Kosten:
public class Cat {

   String name;
   int age;

   // Pour le premier chat
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   // Pour le deuxième chat
   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5);
       Cat streetCatNamedBob = new Cat("Bob");
   }

}
Zusätzlich zum Ursprungskonstrukteur mit den Parametern „Name“ und „Alter“ haben wir einen anderen Konstrukteur mit nur dem Parameternamen hinzugefügt. Die genaue Vorgehensweise besteht darin, dass wir die Methoden in den vorangegangenen Lektionen zusätzlich anwenden. Nun, wir haben zwei Arten von Chats erstellt :) Sie haben uns an den Beginn der Veranstaltung erinnert, und wir wissen, dass Sie die Entwickler bereits genutzt haben, ohne dafür einen Preis zu zahlen? Nous ne plaisantions pas. Es ist so, dass jede Java-Klasse über einen standardmäßigen Konstrukteur verfügt . Es gibt keine Argumente, aber es ist das Wichtigste, was Sie tun müssen, um ein Objekt zu schaffen, das nicht von Bedeutung ist.
public class Cat {

   public static void main(String[] args) {

       Cat smudge = new Cat(); // Le constructeur par défaut est appelé ici
   }
}
Zum ersten Mal ist es unsichtbar. Wir haben ein Objekt erschaffen, und danach? Hat der Konstrukteur es geschafft, dass er sich hier entschieden hat? Zum Lesen wurde ausdrücklich ein Videokonstrukteur für die Cat- Klasse geschrieben . Wir alle fügen dem Inneren einen Satz hinzu. Wenn der Satz angezeigt wird, muss der Konstrukteur darauf hingewiesen werden.
public class Cat {

   public Cat() {
       System.out.println("Un chat a été créé !");
   }

   public static void main(String[] args) {

       Cat smudge = new Cat(); // Le constructeur par défaut est appelé ici
   }
}
Konsolentyp:
Ein ganz neuer Chat!
Voilà la Bestätigung! Der standardmäßige Konstrukteur ist immer in diesen Klassen vorhanden, er ist jedoch unsichtbar. Aber Sie wissen, dass Sie sich für dieses Thema entschieden haben. Der Konstrukteur besteht standardmäßig aus einer Klasse, die Sie mit Argumenten erstellen. Endlich, wir haben vor Kurzem das Beste aus der Welt geschafft. Enthält diesen Code:
public class Cat {

   String name;
   int age;

   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat smudge = new Cat(); // Erreur !
   }
}
Wir haben Cat ohne Namen und Alter erstellt, wir haben einen Cat- Konstrukteur mit den Parametern string und int erklärt . Dies liegt an der unmittelbaren Ungleichheit des Herstellers gegenüber der Standardklasse. Achten Sie darauf, dass Sie keine zusätzlichen Konstrukteure in Ihrer Klasse benötigen, und geben Sie keinen Konstrukteur ohne Argumente ein. Sie müssen diesen letzten Schritt erklären . Nehmen wir zum Beispiel an, dass wir ein Programm für eine Tierarztpraxis erstellen. Unsere Klinik hat gute Maßnahmen ergriffen und die Chatons ohne Zweifel unterstützt, da ihre Namen und ihr Alter nicht unklar sind. In diesem Fall ähnelt unser Code diesem:
public class Cat {

   String name;
   int age;

   // Pour les chats avec propriétaire
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   // Pour les chats adoptés
   public Cat() {
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5);
       Cat streetCat = new Cat();
   }
}
Da wir standardmäßig einen expliziten Konstrukteur geschrieben haben, können wir zwei Arten von Chats erstellen :) Mit dieser Methode ist die Reihenfolge der Übermittlung von Argumenten an einen Konstrukteur sehr wichtig. Ändern Sie den Namen und das Alter der Argumente in unserem Konstrukteur.
public class Cat {

   String name;
   int age;

   public Cat(int age, String name) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 10); // Erreur !
   }
}
Ein Fehler! Der Konstrukteur legt klar, dass ein Objekt erstellt werden muss und in diesem Auftrag einen Namen und eine Kette erhalten muss . Unser Code funktioniert nicht. Essay über das Andenken und den Garder mit Geist, nachdem Sie Ihre eigenen Klassen erklärt haben:
public Cat(String name, int age) {
   this.name = name;
   this.age = age;
}

public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
Es gibt zwei völlig unterschiedliche Konstrukteure! Wenn wir Abweichungen in einem einzigen Satz aussprechen, der auf die Frage antwortet : „Wollen Sie von einem Konstrukteur gefragt werden?“ » , wir sagen: „Um sicherzustellen, dass die Gegenstände einen gültigen Status haben“. Wenn Sie Konstrukteure verwenden, werden alle Variablen initialisiert und korrigiert. Diese Programme sind nicht mit 0 oder 0 anderen „ungültigen“ Objekten im Auto unterwegs. Ihr Hauptvorteil liegt für den Programmierer. Wenn Sie die Spiele manuell starten (nach der Erstellung eines Objekts), besteht ein großes Risiko, dass Sie sich entscheiden und etwas Falsches einführen. Das Produkt wurde jedoch nicht mit einem Konstrukteur hergestellt: Wenn Sie die erforderlichen Argumente übertragen müssen oder die anderen Argumenttypen übergeben haben, registriert der Compiler sofort einen Fehler. Wir weisen auch darauf hin, dass Sie die Logik Ihres Programms nicht in das Innere eines Konstrukteurs einbinden müssen . Das sind die MethodenDiener. Die Methoden werden Ihnen dabei helfen, alle erforderlichen Funktionen festzulegen. Ich möchte Ihnen sagen, dass die Logik eines Konstrukteurs eine bösartige Idee ist:
public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Notre usine de voitures s'appelle " + this.name);
   System.out.println("Elle a été fondée il y a " + this.age + " ans" );
   System.out.println("Depuis, elle a produit " + this.carsCount + " voitures");
   System.out.println("En moyenne, elle produit " + (this.carsCount/this.age) + " voitures par an");
}

   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Ford", 115 , 50000000);
   }
}
Wir haben eine Klasse von CarFactory , die den Gebrauch von Fahrzeugen beschreibt. Im Inneren des Konstrukteurs haben wir alle Champs initialisiert und eine bestimmte Logik hinzugefügt: Wir fügen dem Benutzer alle Informationen hinzu. A priori rien de mal à cela. Die Programmfunktion. Konsolentyp:
Unser Auto ist seit 115 Jahren bei Ford. Sie hat 50000000 Autos produziert, vor einem Jahr, 434782 Autos pro Jahr
Aber wir stellen eine Bombe der Verzögerung dar, ohne sie zu realisieren. Dieses Codegenre kann leicht zu Fehlern führen. Es wird angenommen, dass wir nicht mit Ford gesprochen haben, sondern von einem neuen Benutzer namens „Amigo Motors“, der seit mehr als einem Jahr existiert und 1000 Autos produziert hat:
public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Notre usine de voitures s'appelle " + this.name);
   System.out.println("Elle a été fondée il y a " + this.age + " ans" );
   System.out.println("Depuis, elle a produit " + this.carsCount + " voitures");
   System.out.println("En moyenne, elle produit " + (this.carsCount/this.age) + " voitures par an");
}


   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Amigo Motors", 0 , 1000);
   }
}
Konsolentyp:
Notre usine de voitures s'appelle Amigo Motors Exception in thread "main" java.lang.ArithmeticException: / by zero Er wurde vor 0 Jahren gegründet und hat 1000 Autos bei CarFactory produziert. (CarFactory.java:15) bei CarFactory.main(CarFactory.java:23) Prozess mit Exit-Code 1 abgeschlossen
Boum! Das Programm endete aufgrund eines unverständlichen Fehlers. Kannst du die Ursache herausfinden? Das Problem liegt in der Logik, die wir im Rahmen des Konstrukteurs platzieren mussten. Genauer gesagt, diese Zeile:
System.out.println("En moyenne, elle produit " + (this.carsCount/this.age) + " voitures par an");
Hierdurch führen Sie eine Berechnung durch und teilen die Anzahl der produzierten Fahrzeuge nach der Nutzungsdauer auf. Und da unser Benutzer neu ist (das heißt, er liegt bei 0 Jahren), haben wir Divisionen von 0, so dass wir nicht in der Lage sind, Mathematik zu lernen. Infolgedessen wird das Programm aufgrund eines Fehlers beendet. Qu'aurions-nous dû faire ? Die gesamte Logik wird durch eine bestimmte Methode gesteuert. Ruft diese Methode printFactoryInfo() auf . Du könntest ein CarFactory- Objekt als Argument übertragen. Sie können die gesamte Logik berücksichtigen und potenzielle Fehler im Laufe der Zeit vermeiden (da dies nicht unbedingt erforderlich ist, wenn die Anzahl der Jahre nicht überschritten wird). À chacun son rôle. Die Konstrukteure sind nicht erforderlich, um einen gültigen Objektstatus festzulegen.Wir haben die Methoden für die Logik entwickelt. Keine Mischung aus einem mit dem anderen.
Dieser Artikel ist auch auf Englisch verfügbar:
Lesen Sie die englische Version dieses Artikels, um Konstruktoren in Java zu verstehen. Konstrukteure sind interessanter und subtiler, als Sie vielleicht denken.
Kommentare (1)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Beastenjahrn Level 11, Germany, Germany
6 August 2023
Ich freue mich, dass die "Pflichtlekturen" ins Deutsche übersetzt wurden, aber warum wurde die französische Fassung zur Übersetzung verwendet, anstatt die englische Fassung. Ohne die englische Fassung wüsste ich gar nicht, was in den letzten Beispielen überhaupt steht. Ich hatte nie Französisch-Unterricht, dafür aber Englisch :) Außerdem wäre es nett, wenn eine Verlinkung bei den "Nützliche Links vom Professor" auch für die deutsche Fassung geben würde. Ich bin nur per Zufall auf die deutsche Fassung gestoßen.