Ένας τύπος enum είναι ένας ειδικός τύπος δεδομένων που επιτρέπει σε μια μεταβλητή να είναι ένα σύνολο προκαθορισμένων σταθερών.
Η μεταβλητή πρέπει να είναι ίση με μία από τις τιμές που έχουν προκαθοριστεί για αυτήν.
Συνήθη παραδείγματα περιλαμβάνουν τις κατευθύνσεις της πυξίδας (τιμές των NORTH, SOUTH, EAST και WEST) και τις ημέρες της εβδομάδας.
Επειδή είναι σταθερές, τα ονόματα των πεδίων ενός τύπου enum είναι με κεφαλαία γράμματα.
Στη γλώσσα προγραμματισμού Java, ορίζεις έναν τύπο enum χρησιμοποιώντας τη λέξη-κλειδί enum.
Για παράδειγμα, θα όριζες έναν τύπο enum για τις ημέρες της εβδομάδας ως εξής:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Θα πρέπει να χρησιμοποιείς τύπους enum κάθε φορά που χρειάζεται να αναπαραστήσεις ένα σταθερό σύνολο σταθερών. Αυτό περιλαμβάνει φυσικούς τύπους enum, όπως οι πλανήτες του ηλιακού μας συστήματος και σύνολα δεδομένων όπου γνωρίζεις όλες τις πιθανές τιμές σε χρόνο μεταγλώττισης, για παράδειγμα, τις επιλογές σε ένα μενού, σημαίες γραμμής εντολών και ούτω καθεξής.
Ακολουθεί κώδικας που σου δείχνει πώς να χρησιμοποιήσεις το enum DayOfWeek που ορίστηκε παραπάνω:
public class Shop {
public String getOpeningHours(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
return "9am - 5pm";
case SATURDAY:
return "10am - 4pm"
case SUNDAY:
return "Closed.";
}
}
}
var shop = new Shop();
shop.getOpeningHours(DayOfWeek.WEDNESDAY);
// => "9am - 5pm"
Οι τύποι enum της γλώσσας προγραμματισμού Java είναι πολύ πιο ισχυροί από τους αντίστοιχούς τους σε άλλες γλώσσες.
Η δήλωση enum ορίζει μια κλάση (που ονομάζεται τύπος enum).
Το σώμα της κλάσης enum μπορεί να περιλαμβάνει μεθόδους και άλλα πεδία:
public enum Rating {
GREAT(5),
GOOD(4),
OK(3),
BAD(2),
TERRIBLE(1);
private final int numberOfStars;
Rating(int numberOfStars) {
this.numberOfStars = numberOfStars;
}
public int getNumberOfStars() {
return this.numberOfStars;
}
}
Καλώντας τη μέθοδο getNumberOfStars σε ένα μέλος του τύπου enum Rating:
Rating.GOOD.getNumberOfStars();
// => 4
Σε αυτή την άσκηση θα επεξεργάζεσαι γραμμές καταγραφής.
Κάθε γραμμή καταγραφής είναι μια συμβολοσειρά με την εξής μορφή: "[<LVL>]: <MESSAGE>".
Αυτά είναι τα διαφορετικά επίπεδα καταγραφής:
TRC (trace)DBG (debug)INF (info)WRN (warning)ERR (error)FTL (fatal)Έχεις τρεις εργασίες.
Όρισε ένα enum LogLevel που έχει έξι στοιχεία, τα οποία αντιστοιχούν στα παραπάνω επίπεδα καταγραφής.
TRACEDEBUGINFOWARNINGERRORFATALΣτη συνέχεια, υλοποίησε τη μέθοδο LogLine.getLogLevel() που επιστρέφει το αναλυμένο επίπεδο καταγραφής μιας γραμμής καταγραφής:
var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO
Δυστυχώς, κάποιες φορές μερικές γραμμές καταγραφής έχουν άγνωστο επίπεδο καταγραφής.
Για να χειριστείς ομαλά αυτές τις γραμμές καταγραφής, πρόσθεσε ένα στοιχείο UNKNOWN στο enum LogLevel, το οποίο θα πρέπει να επιστρέφεται όταν αναλύεται ένα άγνωστο επίπεδο καταγραφής:
var logLine = new LogLine("[XYZ]: Overly specific, out of context message");
logLine.getLogLevel();
// => LogLevel.UNKNOWN
Το επίπεδο καταγραφής μιας γραμμής καταγραφής είναι αρκετά εκτενές.
Για να μειωθεί ο χώρος στον δίσκο που απαιτείται για την αποθήκευση των γραμμών καταγραφής, αναπτύχθηκε μια σύντομη μορφή: "[<ENCODED_LEVEL>]:<MESSAGE>".
Το κωδικοποιημένο επίπεδο καταγραφής είναι μια απλή αντιστοίχιση ενός επιπέδου καταγραφής σε έναν αριθμό:
UNKNOWN - 0
TRACE - 1
DEBUG - 2
INFO - 4
WARNING - 5
ERROR - 6
FATAL - 42
Υλοποίησε τη μέθοδο LogLine.getOutputForShortLog() που μπορεί να παράγει τη συντομευμένη μορφή της γραμμής καταγραφής:
var logLine = new LogLine("[ERR]: Stack Overflow");
logLine.getOutputForShortLog();
// => "6:Stack Overflow"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Java με 26 έννοιες158 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.