Java Enum Tutorial: Τι είναι και πώς να το εφαρμόσετε;



Αυτό το άρθρο σχετικά με το Java Enum Tutorial θα σας δώσει μια λεπτομερή γνώση των σταθερών Enum μαζί με πρακτικά παραδείγματα για καλύτερη κατανόηση.

ο Καταμέτρηση σε είναι ένας τρόπος καθορισμού μιας τάξης με σταθερές και ονομαστικές σταθερές με τις αντίστοιχες χρησιμοποιώντας τη λέξη-κλειδί απαρ. Σε αυτό ' Εκμάθηση Java Enum Άρθρο, θα μάθουμεορίστε την απαρίθμηση μαζί μεπαραδείγματα για καλύτερη κατανόηση.

Τι είναι η απαρίθμηση;

Java Enums είναι τάξεις που έχουν ένα σταθερό σύνολο σταθερών ή μεταβλητών που δεν τείνουν να αλλάζουν. Η απαρίθμηση στην Java επιτυγχάνεται χρησιμοποιώντας τη λέξη-κλειδί απαρ. Η Ιάβα απαρ οι σταθερές είναι στατικός και τελικός σιωπηρά. Η δυνατότητα Enum είναι διαθέσιμη από τότε Έκδοση JDK 1.5.





Γιατί χρειαζόμαστε απαρίθμηση;

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

Δουλειά Τύπος: (Σύμβαση / Προσωρινός / Μόνιμος)



Υπάλληλος εκμάθησης Java enum

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

Διαφορές μεταξύ Enum και Class

Αν και μια τάξη και enum έχουν παρόμοια λειτουργικότητα σε περιβάλλον Java, διαφέρουν σε μερικές πτυχές. Ας συζητήσουμε τις διαφορές



Ενουμ Τάξη
Δεν είναι δυνατή η παράκαμψη των σταθερών του συνόλουΟι σταθερές τάξης μπορούν να παρακαμφθούν
Το Enum δεν υποστηρίζει τη δημιουργία αντικειμένωνΗ τάξη υποστηρίζει τη δημιουργία αντικειμένων
Το Enum δεν μπορεί να επεκτείνει άλλες τάξειςΜια τάξη μπορεί να επεκτείνει άλλες τάξεις
enum γμια διεπαφή υλοποίησηςΜια τάξη μπορεί να εφαρμόσει διεπαφή


Πρακτικά παραδείγματα Enum

Τώρα, για να κατανοήσουμε το enum με πολύ καλύτερο τρόπο, ας εκτελέσουμε μερικά πρακτικά παραδείγματα με βάση τα ακόλουθα.

Ορισμός της απαρίθμησης σε Java

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

Σύνταξη:

όνομα enum {constants}

Σε αυτό το παράδειγμα, έχουμε δηλώσει το κύριος() μέθοδος μέσα απαρ

ορισμός πακέτου δημόσια τάξη Edureka {enum Level {BAJA, KTM, YAMAHA} public static void main (String [] args) {Level myVar = Level.KTM System.out.println (myVar)}}

// Ouput

ΚΤΜ

Σε αυτό το παράδειγμα, το κύριος() δηλώνεται η μέθοδος εξω απο του enum.

ορισμός πακέτου enum Χρώμα {BAJAJ, KTM, YAMAHA} δημόσια τάξη Edureka {public static void main (String [] args) {Bike b1 = Color.YAMAHA System.out.println (b1)}}

//Παραγωγή:

ΓΑΜΑΧΑ

Enum που χρησιμοποιείται στο Switch Case

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

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

πακέτο εναλλαγή enum Ημέρα {ΚΥΡΙΑΚΗ, ΔΕΥΤΕΡΑ, ΤΡΙΤΗ, ΤΕΤΑΡΤΗ, ΠΕΜΠΤΗ, ΠΑΡΑΣΚΕΥΗ, ΣΑΒΒΑΤΟ} δημόσια τάξη Edureka {Day day public Edureka (Day day) {this.day = day} δημόσια άκυρη ημέρα ΔΕΥΤΕΡΑ: System.out.println («Γεια, Σήμερα είναι Δευτέρα») περίπτωση διακοπής ΤΡΙΤΗ: System.out.println («Γεια, Σήμερα είναι Τρίτη») περίπτωση διακοπής ΤΕΤΑΡΤΗ: System.out.println («Γεια, Σήμερα είναι Τετάρτη υπόθεση διακοπής ΠΕΜΠΤΗ: System.out.println («Γεια, Σήμερα είναι Πέμπτη») περίπτωση διακοπής ΠΑΡΑΣΚΕΥΗ: System.out.println («Γεια, Σήμερα είναι Παρασκευή.») περίπτωση διακοπής ΣΑΒΒΑΤΟ: System.out.println (' Γεια, Σήμερα είναι το σαββατοκύριακο σας) περίπτωση διακοπής ΚΥΡΙΑΚΗ: System.out.println («Γεια, Σήμερα είναι αργία») προεπιλογή διακοπής: System.out.println («Παρακαλώ εισάγετε μια έγκυρη ημέρα». void main (String [] args) {String str = 'MONDAY' Edureka e1 = νέο Edureka (Day.valueOf (str)) e1.dayIsLike ()}}

//Παραγωγή:

Γεια, Σήμερα είναιΔευτέρα

Κληρονομικότητα χρησιμοποιώντας enum

Βασικά, οποιοδήποτε απαρ αντιπροσωπεύεται ως κλάση που επεκτείνει την αφηρημένη κλάση java.lang. Ενουμ και έχει αρκετά στατικά μέλη. Επομένως, ένα απαρ δεν μπορεί να επεκτείνει οποιαδήποτε άλλη τάξη ή απαρ δεν υπάρχει πολλαπλό κληρονομιά . Ας εκτελέσουμε ένα παράδειγμα για να το κατανοήσουμε καλύτερα.

Εδώ, θα κληρονομήσουμε το λειτουργικό σύστημα με βάση τον κατασκευαστή τηλεφώνου.

πακέτο κληρονομιάς εισαγωγής java.util.ArrayList εισαγωγή java.util.List δημόσια τάξη Edureka {public static void main (String [] args) {List وارث = new ArrayList () وارث.add (LibraryEnum.FIRST) وارث.add (ClientEnum). google) για το (HTTPMethodConvertible element: maut) {System.out.println (element.getHTTPMethodType ())}} στατική διεπαφή HTTPMethodConvertible {public String getHTTPMethodType ()} static enum LibraryEnum υλοποιεί HTTPMethodConvertible {FIRST ('Google Pixel'), SECOND «Huawei»), ΤΡΙΤΟ («Apple 11 Pro») String httpMethodType LibraryEnum (String phone) {httpMethodType = phone} public String getHTTPMethodType () {return httpMethodType}} στατικό enum ClientEnum υλοποιεί HTTPM MethodConvertible {huawei ('HongMing OS'), apple ('iOS'), google ('Android One') Συμβολοσειρά httpMethodType ClientEnum (String s) {httpMethodType = s} public String getHTTPMethodType () {return httpMethodType}}}

//Παραγωγή:

Google Pixel
Android One

Enum με προσαρμοσμένες τιμές

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

enum Traffic {ΚΟΚΚΙΝΟ ('STOP'), ORANGE ('WAIT'), ΠΡΑΣΙΝΟ ('GO')}

Στο παραπάνω παράδειγμα, μπορούμε να δούμε ότι το Traffic enum έχει τρία μέλη. Και συγκεκριμένα,

ΚΟΚΚΙΝΟ ΠΟΡΤΟΚΑΛΙ και ΠΡΑΣΙΝΟΣ με τις δικές τους διαφορετικές προσαρμοσμένες τιμές ΣΤΑΣΗ, ΠΕΡΙΜΕΝΤΕ και ΠΗΓΑΙΝΩ αντίστοιχα.

Τώρα για να χρησιμοποιήσουμε τον ίδιο τύπο enum στον κώδικα, αναμένεται να ακολουθήσουμε ορισμένα σημεία που είναι:

  • Πρέπει να δημιουργήσουμε παραμετροποιημένος κατασκευαστής για αυτήν την κατηγορία enum. Επειδή το ξέρουμε αυτό απαρ Το αντικείμενο της τάξης δεν μπορεί να δημιουργηθεί ρητά, επομένως για την προετοιμασία χρησιμοποιούμε παραμετροποιημένο κατασκευαστή.
  • ο οικοδόμος δεν μπορεί να είναι το κοινό ή να προστατεύεται που πρέπει να έχει ιδιωτικός ή Προκαθορισμένο τροποποιητές. Εάν δημιουργήσουμε δημόσιο ή προστατευμένο, θα επιτρέψει την προετοιμασία περισσότερων από ενός αντικειμένων που είναι εντελώς αντίθετα λειτουργικότητα enum.
  • Πρέπει να δημιουργήσουμε μια μέθοδο λήψης για να πάρουμε την αξία του απαριθμεί.

Ας εκτελέσουμε ένα πρόγραμμα βασισμένο σε αυτό.

package traffic enum TrafficSignal {RED ('STOP'), GREEN ('GO'), ORANGE ('WAIT') private String action public String getAction () {return this.action} private TrafficSignal (String action) {this.action = action}} δημόσια τάξη Edureka {public static void main (String args []) {TrafficSignal [] σήματα = TrafficSignal.values ​​() για (TrafficSignal σήμα: σήματα) {System.out.println ('name:' + signal.name () + 'action:' + signal.getAction ())}}}

//Παραγωγή:

Όνομα: ΚΟΚΚΙΝΗ δράση: STOP
Όνομα: ΠΡΑΣΙΝΗ δράση: GO
αρσενικόςε: ΠΟΡΤΟΚΑΛΙ δράση: Περιμένετε

Προσθέστε τις δηλώσεις if-else-if

Τώρα, ας εκτελέσουμε ένα πρόγραμμα με βάση enum στις δηλώσεις if-else-if. Εδώ, θα βρούμε την κατεύθυνση της διέλευσης περνώντας τις τιμές των κατευθύνσεων που είναι διαθέσιμες στο enum.

πακέτο Οδηγίες enum Οδηγίες {EAST, WEST, NORTH, SOUTH} δημόσια τάξη Edureka {public static void main (String args []) {Οδηγίες dir = Directions.NORTH if (dir == Οδηγίες.EAST) {System.out.println ( 'Direction: East')} αλλιώς εάν (dir == Directions.WEST) {System.out.println ('Direction: West')} αλλιώς εάν (dir == Οδηγίες.ΝΟΡΘ) {System.out.println ('Direction : Βόρεια ')} άλλο {System.out.println (' Direction: South ')}}}

//Παραγωγή:

Λένεction: Βόρεια

Διαφορετικές μέθοδοι που χρησιμοποιούνται με το enum

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

//Σύνταξη:

δημόσιες τιμές στατικού τύπου enum [] ()

Θα μάθουμε την τιμή ευρετηρίου ενός συγκεκριμένου στοιχείου σε έναν πίνακα.

λάβετε ημερομηνία από το string java
τιμές πακέτου enum Χρώμα {ΚΟΚΚΙΝΟ, ΠΡΑΣΙΝΟ, ΜΠΛΕ} δημόσια τάξη Edureka {δημόσιος στατικός κενός κενός (String [] args) {Color arr [] = Color.values ​​() for (Color col: arr) {System.out.println ( col + 'στο ευρετήριο' + col.ordinal ())} System.out.println (Color.valueOf ('RED'))}}

//Παραγωγή:

ΚΟΚΚΙΝΟ στο ευρετήριο 0
ΠΡΑΣΙΝΟ στο ευρετήριο 1
ΜΠΛΕ στο ευρετήριο 2
ΚΑΘΑΡΑ

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

//Σύνταξη:

δημόσια στατική τιμή τύπου enumOf (String str)

Εδώ, θα βρούμε το κόστος ενός συγκεκριμένου τηλεφώνου με βάση την είσοδο που περνάμε στη συμβολοσειρά.

τιμές πακέτου of enum Mobile {Samsung (1099), Apple (1250), Google (1325) int τιμή Mobile (int p) {price = p} int showPrice () {return price}} δημόσια τάξη Edureka {public static void main (String args []] {System.out.println ('Λίστα κινητών τηλεφώνων:') για (Mobile m: Mobile.values ​​()) {System.out.println (m + 'cost' + m.showPrice () + 'dollar' )} Mobile ret ret = Mobile.valueOf ('Samsung') System.out.println ('Επιλεγμένο:' + ret)}}

//Παραγωγή:

Η Samsung κοστίζει 1099 δολάρια
Η Apple κοστίζει 1250 δολάρια
Η Google κοστίζει 1325 δολάρια
Επιλεγμένο: Samsung

Τακτικός(): Ο διερμηνέας Java προσθέτει το τακτικός() μέθοδο εσωτερικά όταν δημιουργεί ένα απαρ. Η κανονική () μέθοδος επιστρέφει το δείκτης της τιμής enum.

//Σύνταξη:

δημόσιο τελικό ενδοδικαστικό ()

Εδώ, θα ανακαλύψουμε την τιμή ευρετηρίου ενός συγκεκριμένου στοιχείου σε έναν πίνακα. και επίσης, η θέση του κεράσι.

Πακέτο φρούτων ordinal enum {Apple, Banana, Cherry, Date, Elderberry} enum Vegetables {Carrot, Beetroot, Beans, Tomato, Onion} public class Edureka {public static void main (String [] args) {Fruits [] fru = Fruits. τιμές () για (Fruits fr: fru) {System.out.println (fr + ':' + fr.ordinal ())} Fruits f1, f2, f3 f1 = Fruits.Apple f2 = Fruits.Cherry f3 = Fruits.Apple if (f2.compareTo (f1)> 0) {System.out.println (f2 + 'έρχεται μετά από' + f1)} Λαχανικά v1 = Λαχανικά. Beetroot if (f1.equals (v1)) {System.out.println (' Εσφαλμένο ')}}}

//Παραγωγή:

Apple: 0
Μπανάνα: 1
Κεράσι: 2
Ημερομηνία: 3
Elderberry: 4
Το κεράσι έρχεται μετά την Apple

Πλεονεκτήματα του Enum

  • Το Enum στη Java βελτιώνεται ασφάλεια τύπου
  • Το Enum έχει σχεδιαστεί ώστε να μπορεί να χρησιμοποιηθεί εύκολα εναλλαγή θήκες
  • Το Enum μπορεί να είναι διασχίζομαι
  • Το Enum μπορεί να έχει πεδία, μέθοδοι, και κατασκευαστές
  • Ο Enum μπορεί να εφαρμόσει διεπαφές
  • Το Enum δεν μπορεί να επεκτείνει a τάξη γιατί εσωτερικά, επεκτείνεται Ενουμ τάξη

Enum Usecase: Παιχνίδι ροκ, χαρτιού, ψαλιδιού

Θα το χρησιμοποιησουμε απαρ στην Java για να δημιουργήσουμε το παιδικό μας παιχνίδι, το ροκ χαρτί και το ψαλίδι . Ο παρακάτω κώδικας εξηγεί πώς.

πακέτο Edureka import java.util.Random import java.util.Scanner enum HandSign {SCISSOR, PAPER, STONE} δημόσια τάξη SPS {public static void main (String [] args) {Random random = new Random () boolean gameOver = false HandSign playerMove = HandSign.SCISSOR HandSign computerMove int numTrials = 0 int numComputerWon = 0 int numPlayerWon = 0 int numTie = 0 Scanner in = new Scanner (System.in) System.out.println ('n Αφήστε μας να ξεκινήσουμε ... n') ενώ (! gameOver) {System.out.printf ('% nScissor-Paper-Stonen') boolean validInput do {System.out.print ('nΗ στροφή σας (Παρακαλώ εισάγετε s για ένα ψαλίδι, p για χαρτί, t για πέτρα, q για έξοδο): n ') char inChar = in.next (). toLowerCase (). charAt (0) validInput = true if (inChar ==' q ') {gameOver = true} αλλιώς εάν (inChar ==' s ' ) {playerMove = HandSign.SCISSOR} αλλού εάν (inChar == 'p') {playerMove = HandSign.PAPER} άλλο αν (inChar == 't') {playerMove = HandSign.STONE} άλλο {System.out.println ( 'nΠαρακαλώ ελέγξτε την είσοδο και δοκιμάστε ξανά! n') validInput = false}} ενώ (! val idInput) if (! gameOver) {int aRandomNumber = random.nextInt (3) if (aRandomNumber == 0) {computerMove = HandSign.SCISSOR System.out.println ('nI's My turn: SCISSORn')} αλλιώς εάν (aRandomNumber = = 0) {computerMove = HandSign.PAPER System.out.println ('nI's My turn: PAPERn')} other {computerMove = HandSign.STONE System.out.println ('nI's My turn: STONEn')} εάν (computerMove = = playerMove) {System.out.println ('nI is a Tie! n') ++ numTie} άλλο αν (computerMove == HandSign.SCISSOR & amp & amp playerMove == HandSign.PAPER) {System.out.println ('nScissor κόβει χαρτί , Κέρδισα! N ') ++ numComputerWon} αλλιώς εάν (computerMove == HandSign.PAPER & amp & amp playerMove == HandSign.STONE) {System.out.println (' nPaper wraps stone, κέρδισα! N ') ++ numComputerWon} αλλιώς εάν (computerMove == HandSign.STONE & amp & amp playerMove == HandSign.SCISSOR) {System.out.println ('nStone break scissor, I win! n') ++ numComputerWon} other {System.out.println ('nC Congratulations. ..! Κερδίσατε! N ') ++ numPlayerWon} ++ numTrials}} System.out.printf ('% nΟ αριθμός των δοκιμών: '+ numTrials) System.out.printf (' Κέρδισα% d (%. 2f %%) Κερδίσατε% d (%. 2f %%).% N ', numComputerWon, 100.0 * numComputerWon / numTrials, numPlayerWon, 100.0 * numPlayerWon / numTrials) System.out.println (' Αντί !, Ελπίζω να σας άρεσε ..! ') )}}

//Παραγωγή:

Ας αρχίσουμε...
Ψαλίδι-Χαρτί-Πέτρα
Η σειρά σας (Παρακαλώ εισάγετε s για ένα ψαλίδι, p για χαρτί, t για πέτρα, q για έξοδο):
μικρό
Είναι η σειρά μου: STONE
Ψαλίδι σπασμένων πετρών, κέρδισα!
Ψαλίδι-Χαρτί-Πέτρα
Η σειρά σας (Παρακαλώ εισάγετε s για ένα ψαλίδι, p για χαρτί, t για πέτρα, q για έξοδο):
τι
Ο αριθμός των δοκιμών: 1 κέρδισα 1 (100,00%). Κερδίσατε 0 (0,00%).
Γεια !, Ελπίζω να σας άρεσε ..!

Με αυτό, φτάνουμε στο τέλος αυτού του Java Enum Tutorial. Ελπίζω να έχετε κατανοήσει το Enum στην Java και την εφαρμογή του μέσω παραδειγμάτων σε πραγματικό χρόνο.

Τώρα που έχετε καταλάβει απαρ βασικά μέσα από αυτό το 'Java Enum Tutorial' δείτε το από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο. Τα μαθήματα εκπαίδευσης και πιστοποίησης Java J2EE και SOA της Edureka έχουν σχεδιαστεί για μαθητές και επαγγελματίες που θέλουν να γίνουν προγραμματιστές Java. Το μάθημα έχει σχεδιαστεί για να σας δώσει μια πρώτη αρχή στον προγραμματισμό Java και να σας εκπαιδεύσει τόσο για βασικές όσο και για προχωρημένες ιδέες Java μαζί με διάφορα πλαίσια Java όπως το Hibernate & Ανοιξη .

Έχετε μια ερώτηση για εμάς; Αναφέρετέ το στην ενότητα σχολίων αυτού του ιστολογίου 'Java Enum Tutorial' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.