Προγραμματισμός

Ένθεση με διεπαφές Java

Εάν έχετε διαβάσει το δικό μου Java 101 φροντιστήριο εισαγωγής στατικών τάξεων και εσωτερικών τάξεων, θα πρέπει να είστε εξοικειωμένοι με τα βασικά στοιχεία της εργασίας με ένθετα μαθήματα σε κώδικα Java. Σε αυτήν την συμβουλή Java, θα μάθετε τρεις συνήθεις τρόπους χρήσης τεχνικών ένθεσης με διεπαφές Java. Θα δείξω επίσης εν συντομία διεπαφές ένθεσης με στατικές μεθόδους, επίσης γνωστές ως διασυνδέσεις στατικής μεθόδου.

Περισσότερα για τις διεπαφές Java

Για μια εισαγωγή στις διεπαφές Java, συμπεριλαμβανομένης της διαφοράς μεταξύ κλάσεων και διεπαφών, δείτε το my Java 101 tutorial Εργασία με διεπαφές σε Java.

Διεπαφές ένθεσης σε τάξεις

Η Java σάς επιτρέπει να δηλώνετε διεπαφές εντός κλάσεων. Μόλις δηλωθεί, μια διεπαφή είναι αυτόματα ένα στατικό μέλος της τάξης. Δεν χρειάζεται να δηλώσετε τη διεπαφή με το στατικός λέξη-κλειδί. Εξετάστε το ακόλουθο παράδειγμα:

 class EnclosingClass {interface EnclosedInterface1 {} στατική διεπαφή EnclosedInterface2 {}} 

Εσωτερική διεπαφή1 και Εσωτερική διεπαφή2 είναι στατικές διασυνδέσεις μελών. Δεν υπάρχει ισοδύναμο με τις τοπικές τάξεις, επειδή οι διεπαφές δεν μπορούν να δηλωθούν σε μπλοκ. Ωστόσο, οι διεπαφές μπορούν να χρησιμοποιηθούν σε ανώνυμα περιβάλλοντα κλάσης.

Οι ένθετες διεπαφές συνήθως δεν είναι προσβάσιμες από πέρα ​​από τις κλάσεις που περικλείουν. Διαφορετικά, θα μπορούσατε να τα δηλώσετε ως διεπαφές ανώτερου επιπέδου. Αντ 'αυτού, έχουν πρόσβαση από τα εσωτερικά τους μαθήματα, όπως φαίνεται εδώ:

 class EnclosingClass {interface EnclosedInterface1 {} static interface EnclosedInterface2 {} static class EnclosedClass1 υλοποιεί EnclosedInterface1, EnclosedInterface2 {} class EnclosedClass2 υλοποιεί EnclosedInterface1, EnclosedInterface2 {} void m () {class EnclosedInclosed3} Enface κλειστό }} 

Σημειώστε ότι η στατική τάξη μέλους ΚλειστόClass1, μη στατική τάξη μέλους ΚλειστόClass2και τοπική τάξη ΚλειστόClass3 εφαρμόστε και τις δύο ένθετες διεπαφές. Ωστόσο, μόνο μία διεπαφή μπορεί να εφαρμοστεί σε ένα ανώνυμο περιβάλλον κλάσης. (Ανατρέξτε στην ενότητα Στατικές τάξεις και εσωτερικές τάξεις στην Java για περισσότερα σχετικά με τις ανώνυμες τάξεις.)

Μαθήματα με ένθετες διεπαφές στο java.net

Η τυπική βιβλιοθήκη κλάσης της Java περιλαμβάνει κλάσεις με ένθετες διεπαφές. Για παράδειγμα, Διεύθυνση Inet (στο java.net πακέτο), που αντιπροσωπεύει μια διεύθυνση πρωτοκόλλου Διαδικτύου, δηλώνει ιδιωτικό Διευθύνσεις διεπαφή που υλοποιείται από ιδιωτικό Προσωρινές διευθύνσεις και NameServiceAddresses τάξεις στατικών μελών. Δηλώνει επίσης ιδιωτικό ΌνομαΥπηρεσία διεπαφή που υλοποιείται από ιδιωτικό Υπηρεσία PlatformNameService και HostsFileNameService τάξεις στατικών μελών.

Διεπαφές ένθεσης σε διεπαφές

Η Java σάς επιτρέπει επίσης να δηλώνετε διεπαφές εντός των διεπαφών. Σε αυτήν την περίπτωση, μια ένθετη διεπαφή είναι ένα στατικό μέλος της διεπαφής που περικλείει και για άλλη μια φορά η στατικός η λέξη-κλειδί είναι περιττή. Επίσης, η ένθετη διεπαφή είναι σιωπηρά δημόσια. Ακολουθεί ένα παράδειγμα:

 διεπαφή EnclosingInterface {interface EnclosedInterface1 // σιωπηρά στατική και δημόσια {} στατική διεπαφή EnclosedInterface2 // ρητά στατική και σιωπηρά δημόσια {}} 

Έχετε πρόσβαση σε μια κλειστή διεπαφή προθέτοντας το όνομά της με το όνομα της διεπαφής και τον τελεστή πρόσβασης μέλους. Για παράδειγμα, καθορίστε EnclosingInterface.EnclosedInterface1 για να έχω πρόσβαση σε Εσωτερική διεπαφή1.

Ένθετες διεπαφές στο Java Συλλογές Πλαίσιο

Το Java Συλλογές Πλαίσιο παρέχει πληροφορίες για τη χρησιμότητα της ένθεσης μιας διεπαφής σε μια άλλη. Σκεψου το java.util.Map διεπαφή, η οποία περιγράφει ένα χάρτης (μια συλλογή ζευγών κλειδιού-τιμής). ο Χάρτης διεπαφή αφαιρεί τι σημαίνει να είναι ένας χάρτης. Μαθήματα όπως HashMap και java.util.TreeMap υλοποιώ, εφαρμόζω Χάρτης, περιγράφοντας διαφορετικά είδη εφαρμογών χαρτών.

Χάρτης δηλώνει Είσοδος ως ένα από τα μέλη του. Είσοδος είναι μια ένθετη διεπαφή που περιγράφει ένα ζεύγος τιμών-κλειδιών. ο Είσοδος διεπαφή δηλώνεται σε Χάρτης λόγω της στενής σχέσης μεταξύ των δύο διεπαφών - κάθε καταχώριση πρέπει να ανήκει σε χάρτη. Είσοδος υλοποιείται από το java.util.AbstractMap της τάξης SimpleEntry και SimpleImmutableEntry τάξεις στατικών μελών. Συνήθως θα αγνοήσετε αυτές τις τάξεις στατικών μελών και θα αλληλεπιδράσετε Χάρτης. Είσοδος αντι αυτου.

Μαθήματα ένθεσης σε διεπαφές

Ένα από τα πιο ξένα γλωσσικά χαρακτηριστικά της Java είναι η δυνατότητα ένθεσης μιας τάξης μέσα σε μια διεπαφή. Όπως και με μια ένθετη διεπαφή, η ένθετη τάξη είναι σιωπηρά δημόσια και στατική. Ακολουθεί ένα παράδειγμα:

 διεπαφή EnclosingInterface {class EnclosedClass {}} 

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

Παράδειγμα: Διεύθυνση διεπαφής περικλείει κλάση διευθύνσεων

Ας υποθέσουμε ότι θέλετε να μοντελοποιήσετε διευθυνσιοδοτούμενες οντότητες, όπως γράμματα, καρτ-ποστάλ και δέματα. Κάθε οντότητα θα περιγραφεί από τη δική της τάξη, αλλά όλοι μοιράζονται την ομοιότητα να απευθύνονται σε κάποιο προορισμό. Κάθε τάξη θα μπορούσε να σχεδιαστεί με διπλά πεδία διευθύνσεων, ή μπορείτε να αφαιρέσετε αυτές τις λεπτομέρειες σε ένα κοινό superclass. Εναλλακτικά, θα μπορούσατε να αξιοποιήσετε τη Λίστα 1 Διευθυνσιοδοτούμενο διεπαφή.

Λίστα 1. Διεύθυνση. Java

 δημόσια διεπαφή Διευθυνσιοδοτούμενη {δημόσια τάξη Διεύθυνση {private String boxNumber; ιδιωτικός δρόμος String; ιδιωτική πόλη String; δημόσια διεύθυνση (String boxNumber, String street, String city) {this.boxNumber = boxNumber; this.street = δρόμος; this.city = πόλη; } δημόσια συμβολοσειρά getBoxNumber () {return boxNumber; } δημόσια String getStreet () {return street; } δημόσια συμβολοσειρά getCity () {επιστροφή πόλης; } δημόσια συμβολοσειρά toString () {return boxNumber + "-" + street + "-" + city; }} δημόσια διεύθυνση getAddress (); } 

ο Διευθυνσιοδοτούμενο διεπαφή περιγράφει μια διευθύνσιμη οντότητα ως περιέχει μια διεύθυνση. Αυτή η διεύθυνση περιγράφεται από το ένθετο Διεύθυνση τάξη. ο getAddress () Η μέθοδος εφαρμόζεται από ό, τι εφαρμόζει η τάξη Διευθυνσιοδοτούμενο.

Η λίστα 2 παρουσιάζει τον πηγαίο κώδικα στο α Γράμμα τάξη που εφαρμόζει Διευθυνσιοδοτούμενο.

Λίστα 2. Letter.java

 Δημόσια τάξη Το γράμμα εφαρμόζει Διευθυνσιοδοτούμενο {ιδιωτικό Διεύθυνση Διεύθυνση. Διεύθυνση; δημόσια επιστολή (String boxNumber, String street, String city) {address = new Addressable.Address (boxNumber, street, city); } δημόσια διεύθυνση getAddress () {διεύθυνση επιστροφής; }} 

Γράμμα αποθηκεύει ένα διεύθυνση πεδίο τύπου Διεύθυνση. Διεύθυνση. Αυτή η ένθετη τάξη δημιουργείται από ΓράμμαΚατασκευαστής. Η υλοποίηση getAddress () Η μέθοδος επιστρέφει αυτό το αντικείμενο.

Τώρα σκεφτείτε τι συμβαίνει όταν προσθέτουμε Καρτ ποστάλ και Δέμα μαθήματα στο Διευθυνσιοδοτήσεις εφαρμογή. Η λίστα 3 παρουσιάζει τον πηγαίο κώδικα σε ένα Διευθυνσιοδοτήσεις εφαρμογή, η οποία δείχνει το Καρτ ποστάλ, Δέμα, και Γράμμα τύποι.

Λίστα 3. Addressables.java

 δημόσια τάξη Διευθύνσεις {public static void main (String [] args) {Addressable [] addressables = {new Letter ("100", "Main Street", "Town A"), new Postcard ("200", "Waterfront Drive" , "Town B"), νέο δέμα ("300", "10th Ave", "Town C")}; για (int i = 0; i <addressables.length; i ++) System.out.println (addressables [i] .getAddress ()); }}

ο κύριος() Η μέθοδος δημιουργεί πρώτα έναν πίνακα Διευθυνσιοδοτούμενο αντικείμενα. Στη συνέχεια επαναλαμβάνει αυτά τα αντικείμενα, επικαλούμενη getAddress () σε κάθε αντικείμενο. Οι επιστρεφόμενοι Διεύθυνση. Διεύθυνση αντικείμενο toString () η μέθοδος καλείται από System.out.println () για να επιστρέψει μια παράσταση συμβολοσειράς του αντικειμένου, και αυτή η αναπαράσταση στη συνέχεια εξάγεται.

Συλλογή λιστών 2 και 3 μαζί με Postcard.java και Parcel.java ως εξής:

 javac * .java 

Εκτελέστε την εφαρμογή ως εξής:

 java Διευθύνσεις 

Πρέπει να παρατηρήσετε την ακόλουθη έξοδο:

 100 - Main Street - Town A 200 - Waterfront Drive - Town B 300 - 10th Ave - Town C 

Ένθετες διεπαφές με στατικές μεθόδους (στατικές μέθοδοι διεπαφές)

Πολλοί προγραμματιστές πιστεύουν ότι η τοποθέτηση μιας κλάσης σε μια διεπαφή παραβιάζει τον αντικειμενοστρεφή προγραμματισμό και τον σκοπό μιας διεπαφής. Ωστόσο, είναι καλό να γνωρίζετε σχετικά με αυτήν την ικανότητα, επειδή μπορεί να το συναντήσετε κατά τη διατήρηση του κώδικα κάποιου άλλου. Επιπλέον, τώρα που οι διεπαφές έχουν εξελιχθεί ώστε να περιλαμβάνουν προεπιλεγμένες και στατικές μεθόδους, ενδέχεται να συναντήσετε επιπλέον λόγους για να τοποθετήσετε μια κλάση σε μια διεπαφή. Για παράδειγμα, εδώ είναι μια τοπική τάξη που βρίσκεται μέσα σε μια διεπαφή στατικής μεθόδου:

 διεπαφή I {static void m () {class C {}}} 

συμπέρασμα

Έχω παρουσιάσει τρεις κοινούς τρόπους χρήσης τεχνικών ένθεσης με τάξεις και διασυνδέσεις Java και έδειξα επίσης μια αμφιλεγόμενη τεχνική διασύνδεσης ένθεσης με στατικές μεθόδους. Δείτε το πλήρες Java 101 φροντιστήριο για να μάθετε περισσότερα σχετικά με την ένθεση με στατικές τάξεις και εσωτερικές τάξεις στην Java.

Αυτή η ιστορία, "Nesting with Java interfaces" δημοσιεύθηκε αρχικά από το JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found