Οι γενικές κατηγορίες διευκολύνουν την επαναχρησιμοποίηση. Κάντε τον κώδικά σας επεκτάσιμο και αποτελεσματικό χρησιμοποιώντας γενικές κλάσεις σε Java.
Τα Generics είναι μια έννοια προγραμματισμού που σας επιτρέπει να καθορίσετε τον τύπο που σκοπεύετε να αποθηκεύσετε σε μια συλλογή. Ένας γενικός τύπος μπορεί να είναι οποιαδήποτε μη πρωτόγονη τιμή. Οι παραδοσιακές παράμετροι τύπου που ίσως γνωρίζετε είναι η συμβολοσειρά και ο ακέραιος.
Ωστόσο, μπορείτε να δημιουργήσετε έναν μοναδικό γενικό τύπο. Επιπλέον, μπορείτε να δημιουργήσετε μια γενική τάξη και να τη χρησιμοποιήσετε για να δημιουργήσετε διαφορετικές συλλογές χρησιμοποιώντας γενικά.
Δημιουργία Γενικού Τύπου
Ένας γενικός τύπος είναι ουσιαστικά ένα αντικείμενο, δημιουργήθηκε με χρήση κλάσης ή μια διεπαφή. Έτσι, για αυτό το άρθρο, ο γενικός τύπος θα είναι πελάτης. Χρησιμοποιώντας ένα δείγμα εφαρμογής σε επίπεδο επιχείρησης, ο πελάτης αντιπροσωπεύει μια οντότητα σε ένα σύστημα βάσης δεδομένων. Αυτό το σύστημα βάσης δεδομένων εξυπηρετεί μια εταιρεία επίπλων που έχει τρεις φυσικές τοποθεσίες σε τρεις διαφορετικές πόλεις.
publicabstractclassCustomer{
private String name;
publicCustomer(String name){
this.name = name;
}
public String getName(){
return name;
}
}
Θα παρατηρήσετε το αφηρημένη λέξη-κλειδί στο Πελάτης παραπάνω δήλωση τάξης. Σημαίνει ότι δεν μπορείτε να δημιουργήσετε έναν άμεσο τύπο ή αντικείμενο από το Πελάτης τύπος.
Δεδομένου ότι κάθε τοποθεσία φυσικού καταστήματος θα έχει μια μοναδική λίστα πελατών, η εφαρμογή θα πρέπει να έχει τρεις υποκατηγορίες πελατών που θα εφαρμόσετε χρησιμοποιώντας την έννοια του προγραμματισμού κληρονομικότητας.
Αυτές οι τρεις υποκατηγορίες θα είναι οι στερεοί τύποι στο γενικό Πελάτης τύπος. Ο πρώτος Πελάτης η υποκλάση θα περιέχει τον ακόλουθο κώδικα:
publicclassCity1CustomerextendsCustomer{
publicCity1Customer(String name){
super(name);
}
}
Δημιουργία γενικής τάξης
Για να χρησιμοποιήσετε έναν γενικό τύπο, θα χρειαστεί να έχετε μια γενική κλάση ή μέθοδο που δέχεται αυτόν τον τύπο ως παράμετρο. Για να δημιουργήσετε μια γενική κλάση, πρέπει απλώς να εισαγάγετε την παράμετρο τύπου στη δήλωση κλάσης.
publicclassPromotion<T> {}
Ο παραπάνω κωδικός υποδεικνύει ότι το Προβολή η τάξη είναι γενική. Αυτό σημαίνει ότι το Προβολή Η κλάση χρησιμοποιεί τύπους για να δημιουργήσει τα αντικείμενά της. Τώρα η δήλωση κλάσης μπορεί να πάρει μια συλλογή αντικειμένων που είναι συμβολοσειρές, ακέραιοι αριθμοί, πελάτες και ούτω καθεξής. Ωστόσο, η εταιρεία επίπλων θέλει μόνο το Προβολή κλάση για να δημιουργήσετε αντικείμενα χρησιμοποιώντας το Πελάτης τύπους.
publicclassPromotion<TextendsCustomer> {}
Ο παραπάνω ενημερωμένος κώδικας διασφαλίζει ότι το Προβολή η τάξη παίρνει μόνο το Πελάτης τύπους, αυτό σημαίνει όλες τις υποκατηγορίες του Πελάτης τάξη.
Δεδομένου ότι υπάρχουν τρία καταστήματα, η εταιρεία θέλει να δημιουργήσει μία ανεξάρτητη προσφορά για κάθε κατάστημα. Τα δεδομένα που απαιτούνται για αυτές τις προσφορές είναι παρόμοια. Κάθε προώθηση θα έχει ένα όνομα και μια συλλογή πελατών που κέρδισαν σε αυτήν την προσφορά.
Υπάρχουν διάφοροι τρόποι προσέγγισης αυτού του προβλήματος. Θα μπορούσατε να δημιουργήσετε ένα Προβολή γονική τάξη και έχουν τρεις υποκατηγορίες για κάθε τοποθεσία καταστήματος. Αλλά αφού το καθένα Προβολή έχει παρόμοια δομή, θα καταλήξετε να γράφετε διπλό κώδικα, ο οποίος είναι αναποτελεσματικός (ειδικά επειδή εργάζεστε ήδη με Πελάτης υποκατηγορίες).
Επομένως, α Προβολή Η γενική τάξη είναι μια από τις πιο αποτελεσματικές λύσεις σε αυτό το πρόβλημα.
import java.util.ArrayList;
publicclassPromotion<TextendsCustomer> {
private String promoName;
private ArrayListwinners = new ArrayList<>(); publicPromotion(String promoName){
this.promoName = promoName;
}public String getPromoName(){
return promoName;
}publicvoidaddCustomer(T customer){
if (winners.contains(customer)) {
System.out.println( customer.getName() + " is already a winner of this prize.");
} else {
winners.add(customer);
System.out.println( customer.getName() + " is a winner in the " + this.promoName);
}
}
publicintnumWinners(){
returnthis.winners.size();
}
}
ο Προβολή η γενική κλάση έχει μία μόνο μεταβλητή (promoName). Αυτή η τάξη Java δέχεται μια συλλογή πελατών που κέρδισαν την προώθηση (νικητές) και τους αποθηκεύει σε ένα Δομή δεδομένων ArrayList. Για να προσθέσετε έναν νέο πελάτη σε μια συγκεκριμένη συλλογή προώθησης, θα πρέπει να χρησιμοποιήσετε το addCustomer() μέθοδος. Εάν σε οποιοδήποτε σημείο θέλετε να μάθετε τον αριθμό των πελατών που βρίσκονται σε μια συλλογή, μπορείτε να επικαλεστείτε το numWinners() μέθοδος.
Δημιουργία συλλογών με χρήση γενικής τάξης
Για να ξεκινήσετε να δημιουργείτε συλλογές, θα πρέπει να δημιουργήσετε πελάτες.
publicclassMain{
publicstaticvoidmain(String[] args){
City1Customer john = new City1Customer("John Brown");
City1Customer kelly = new City1Customer("Kelly James");
City2Customer jane = new City2Customer("Jane Doe");
City3Customer jess = new City3Customer("Jess Smith");
}
}
ο Κύριος Η παραπάνω κλάση δημιουργεί τέσσερα αντικείμενα πελατών, καθένα από τα οποία ανήκει σε μία από τις τρεις τοποθεσίες καταστημάτων. Για να ξεκινήσετε τη δημιουργία συλλογών, θα χρειαστεί πρώτα να δημιουργήσετε αντικείμενα προώθησης (ένα για κάθε τοποθεσία καταστήματος).
Promotion city1promo = new Promotion("City1 Promo");
Promotion city2promo = new Promotion("City2 Promo");
Promotion city3promo = new Promotion("City3 Promo");
Εισαγωγή των τριών γραμμών κώδικα παραπάνω στο Κύριος Η τάξη θα δημιουργήσει αποτελεσματικά τρεις προωθήσεις για συγκεκριμένο τύπο (ή για συγκεκριμένη τοποθεσία). Έτσι, μόνο πελάτες από το κατάστημα στην πρώτη τοποθεσία της πόλης (City1Customer) μπορεί να είναι νικητής στην προώθηση αυτής της πόλης (city1promo).
city1promo.addCustomer(john);
city1promo.addCustomer(kelly);
Επομένως, προσθέτοντας τον παραπάνω κώδικα στο Κύριος class θα παράγει το ακόλουθο αποτέλεσμα στην κονσόλα:
Ωστόσο, εάν προσπαθήσετε να προσθέσετε έναν τρίτο πελάτη στη λίστα νικητών της προσφοράς στην πρώτη πόλη, το IDE σας θα παρήγαγε ένα σφάλμα μεταγλώττισης.
Αυτό συμβαίνει γιατί κανένα από τα δύο Ιωάννα ούτε Τζες είναι πελάτης του καταστήματος στην πρώτη πόλη. Η δημιουργία γενικών τύπων και κλάσεων είναι χρήσιμη, καθώς εμποδίζει αυτά τα απλά σφάλματα να μην εντοπιστούν και να καταστρέψουν τη βάση δεδομένων ενός συστήματος. Σε μια μικρή εφαρμογή, μπορεί να είναι εύκολο να εντοπιστούν σφάλματα όπως αυτό, αλλά σε ένα σύστημα σε επίπεδο επιχείρησης, σφάλματα όπως αυτό μπορεί να μην εντοπιστούν.
city2promo.addCustomer(jane);
Η αντικατάσταση της εσφαλμένης γραμμής κώδικα με την παραπάνω θα εκτυπώσει την ακόλουθη έξοδο στην κονσόλα:
Οφέλη από τη χρήση των γενικών τύπων
Από το δείγμα εφαρμογής σε αυτό το άρθρο, μπορείτε να δείτε ότι ένα σημαντικό πλεονέκτημα της χρήσης γενικών τύπων είναι ο έλεγχος τύπου μεταγλώττισης. Χωρίς έλεγχο τύπου, η προσθήκη της Jane σε οποιαδήποτε από τις τρεις λίστες προώθησης δεν θα παρήγαγε σφάλμα χρόνου εκτέλεσης, καθώς η Jane είναι πράγματι πελάτης της εταιρείας επίπλων.
Τα Generics διευκολύνουν επίσης πολλά άλλα πλεονεκτήματα, όπως η επαναχρησιμοποίηση κώδικα και η επεκτασιμότητα. Καθώς η εταιρεία επεκτείνεται σε νέες πόλεις, μπορείτε εύκολα να δημιουργήσετε νέους τύπους αντικειμένων προώθησης, βασιζόμενοι σε μεγάλο βαθμό στον υπάρχοντα κώδικα. Οι γενικοί τύποι σάς επιτρέπουν επίσης να δημιουργείτε αποτελεσματικό κώδικα, ο οποίος αποτελεί κορυφαία προτεραιότητα στη διαδικασία ανάπτυξης λογισμικού.