Τυπική και ρητή αλυσίδα κατασκευαστών

Κατασκευαστική αλυσίδα σε Java είναι απλά η πράξη ενός κατασκευαστή καλώντας έναν άλλο κατασκευαστή μέσω κληρονομία. Αυτό συμβαίνει σιωπηρά όταν κατασκευάζεται μια υποκατηγορία: η πρώτη της εργασία είναι να καλέσει τη μέθοδο κατασκευαστή της μητρικής της. Αλλά οι προγραμματιστές μπορούν επίσης να καλέσουν έναν άλλο κατασκευαστή χρησιμοποιώντας ρητά τις λέξεις-κλειδιά Αυτό() ή σούπερ(). ο Αυτό() η λέξη-κλειδί καλεί άλλο υπερφορτωμένο κατασκευαστή στην ιδια ταξη; ο σούπερ() η λέξη-κλειδί καλεί έναν μη προεπιλεγμένο κατασκευαστή σε μια κλάση.

Υποχρεωτική αλυσίδα κατασκευαστών

Η αλυσιδωτή κατασκευή του κατασκευαστή γίνεται με τη χρήση της κληρονομιάς. Ο πρώτος στόχος της μεθόδου κατασκευάστριας υποκατηγορίας είναι να καλέσει τη μέθοδο κατασκευής της υπερκλάσης. Αυτό εξασφαλίζει ότι η δημιουργία του αντικειμένου της υποκατηγορίας αρχίζει με την αρχικοποίηση των τάξεων πάνω από αυτήν στην αλυσίδα κληρονομιάς.

Θα μπορούσε να υπάρξει αριθμός τάξεων σε μια αλυσίδα κληρονομιάς. Κάθε μέθοδος κατασκευαστή καλεί την αλυσίδα έως ότου επιτευχθεί και αρχικοποιηθεί η κλάση στην κορυφή. Στη συνέχεια, κάθε επόμενη κλάση παρακάτω αρχικοποιείται καθώς η αλυσίδα επιστρέφει πίσω στην αρχική υποκατηγορία. Αυτή η διαδικασία ονομάζεται chaining κατασκευαστή.

instagram viewer

Σημειώστε ότι:

  • Αυτή η έμμεση κλήση στην υπερκλάση είναι ίδια με την υποκλάση που είχε συμπεριλάβει σούπερ() λέξη-κλειδί, δηλαδή σούπερ() είναι σιωπηρή εδώ.
  • Εάν ένας κατασκευαστής μη-args δεν συμπεριλαμβάνεται στην κλάση, η Java δημιουργεί μία πίσω από τη σκηνή και την επικαλείται. Αυτό σημαίνει ότι αν ο μόνος κατασκευαστής σας παίρνει ένα επιχείρημα, πρέπει ρητά χρησιμοποίησε ένα Αυτό() ή σούπερ() λέξη-κλειδί για να την επικαλεστεί (βλ. παρακάτω).

Εξετάστε αυτό το υπερκλάδιο ζώο που επεκτείνεται από το θηλαστικό:

class Animal {
// κατασκευαστής
Ζώο(){
 System.out.println ("Είμαστε στον κατασκευαστή της κλάσης Animal").
}
}
class Mammal επεκτείνει το ζώο {
//constructor
Θηλαστικό ζώο(){
 System.out.println ("Είμαστε κατασκευαστής κλάσης Mammal").
}
}

Τώρα, ας παραθέσουμε την κλάση Mammal:

δημόσια class ChainingConstructors {
 /**
* @param args
*/
δημόσιο static κενό main (String [] args) {
Το θηλαστικό m = νέο θηλαστικό ();
}
}

Όταν εκτελείται το παραπάνω πρόγραμμα, η Java εκκινεί σιωπηρά μια κλήση στον κατασκευαστή ζώων Superclass, στη συνέχεια στον κατασκευαστή κλάσης. Συνεπώς, η παραγωγή θα είναι:

Είμαστε στον κατασκευαστή της κλάσης Animal
Είμαστε στην τάξη του κατασκευαστή του Mammal

Αυξημένη αλυσίδα κατασκευαστών χρησιμοποιώντας αυτό το () ή super ()

Αυτεπάγγελτη χρήση του Αυτό() ή σούπερ() λέξεις-κλειδιά σας επιτρέπει να καλέσετε έναν μη προεπιλεγμένο κατασκευαστή.

  • Για να καλέσετε έναν κατασκευαστή προεπιλογής χωρίς args ή έναν κατασκευαστή με υπερφορτωμένο φορτίο από την ίδια κλάση, χρησιμοποιήστε το Αυτό() λέξη-κλειδί.
  • Για να καλέσετε έναν μη-προεπιλεγμένο κατασκευαστή υπερκλάσης από μια υποκατηγορία, χρησιμοποιήστε το σούπερ() λέξη-κλειδί. Για παράδειγμα, εάν η υπερκλάση έχει πολλαπλούς κατασκευαστές, μια υποκατηγορία μπορεί πάντα να θέλει να καλέσει έναν συγκεκριμένο κατασκευαστή και όχι την προεπιλογή.

Σημειώστε ότι η κλήση σε άλλο κατασκευαστή πρέπει να είναι η πρώτη δήλωση στον κατασκευαστή ή τον κατασκευαστή Ιάβα θα ρίξει ένα σφάλμα σύνταξης.

Εξετάστε τον παρακάτω κώδικα, στον οποίο μια νέα υποκατηγορία, Carnivore, κληρονομεί από την κλάση Mammal που κληρονομεί από την κλάση των ζώων, και κάθε τάξη έχει τώρα έναν κατασκευαστή που παίρνει ένα επιχείρημα.

Εδώ είναι το superclass Animal:

δημόσια τάξη ζώων
ιδιωτικό όνομα συμβολοσειράς.
δημόσιο ζώο (όνομα συμβολοσειράς) // κατασκευαστής με επιχείρημα
{
this.name = όνομα;
System.out.println ("Εκτέλεσα πρώτα.");
}
}
Σημειώστε ότι ο κατασκευαστής χρειάζεται τώρα ένα όνομα του τύπου Σειρά ως παράμετρος και ότι το σώμα της τάξης καλεί Αυτό() στον κατασκευαστή. Χωρίς τη ρητή χρήση του αυτό το όνομα, Η Java θα δημιουργούσε έναν προεπιλεγμένο κατασκευαστή χωρίς args και θα το επικαλούσε.

Εδώ είναι η υποκλάση Mammal:

η δημόσια τάξη Mammal επεκτείνει το Animal {
δημόσιο θηλαστικό (όνομα συμβολοσειράς)
{
super (όνομα);
System.out.println ("Εκτελείται δεύτερη").
}
}

Ο κατασκευαστής του παίρνει επίσης ένα επιχείρημα, και χρησιμοποιεί super (όνομα) για να επικαλεστεί έναν συγκεκριμένο κατασκευαστή στην υπερκλάση του.

Εδώ είναι μια άλλη υποκλάση Carnivore. Αυτό κληρονομεί από το Mammal:

δημόσια τάξη Carnivore επεκτείνει το θηλαστικό {
δημόσια Σαρκοφάγα (όνομα στοιχειοσειράς)
{
super (όνομα);
System.out.println ("Έχω εκτελεστεί τελευταία");
}
}

Όταν εκτελείται, αυτά τα τρία μπλοκ κώδικα θα εκτυπώσουν:

Έχω εκτελεστεί πρώτα.
Είμαι εκτελεσμένος δεύτερος.
Είμαι εκτελεσμένος τελευταίος.

Για να ανακεφαλαιώσουμε: Όταν δημιουργείται ένα στιγμιότυπο της κλάσης Carnivore, η πρώτη ενέργεια της μεθόδου του κατασκευαστή είναι να καλέσει τη μέθοδο κατασκευής των θηλαστικών. Ομοίως, η πρώτη ενέργεια της μεθόδου του κατασκευαστή των θηλαστικών είναι να καλέσουμε τη μέθοδο του κατασκευαστή των ζώων. Μια αλυσίδα των κλήσεων μεθόδου κατασκευαστή εξασφαλίζει ότι το παράδειγμα του αντικειμένου Carnivore έχει προετοιμαστεί σωστά όλες τις κατηγορίες στην αλυσίδα κληρονομιάς του.

instagram story viewer