_枚举类型_是一种特殊的数据类型,它让变量的取值可以是一组预定义的常量。
变量必须等于为它预定义的值之一。
常见的例子包括指南针方向(NORTH、SOUTH、EAST和WEST这几个值)以及一周中的各天。
由于它们是常量,枚举类型中字段的名称使用大写字母。
在 Java 编程语言中,使用 enum 关键字来定义枚举类型。
例如,你可以这样定义一个表示一周中各天的枚举类型:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
只要你需要表示一组固定的常量,就应该使用枚举类型。 这包括像太阳系中的行星这样的自然枚举类型,以及你在编译时就知道所有可能取值的数据集,例如菜单中的选项、命令行标志等等。
下面这段代码展示了如何使用上面定义的 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"
Java 编程语言的枚举类型比其他语言中对应的类型强大得多。
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;
}
}
在 Rating 枚举类型的某个成员上调用 getNumberOfStars 方法:
Rating.GOOD.getNumberOfStars();
// => 4
在本练习中,你将处理日志行。
每一行日志都是一个字符串,格式如下:"[<LVL>]: <MESSAGE>"。
以下是各种日志级别:
TRC(跟踪)DBG(调试)INF(信息)WRN(警告)ERR(错误)FTL(致命)你有三个任务。
定义一个 LogLevel 枚举,其中包含六个元素,分别对应上面的日志级别。
TRACEDEBUGINFOWARNINGERRORFATAL接下来,实现 LogLine.getLogLevel() 方法,返回一行日志解析后的日志级别:
var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO
遗憾的是,有时某些日志行会带有未知的日志级别。
为了妥善处理这些日志行,请向 LogLevel 枚举中添加一个 UNKNOWN 元素,在解析到未知日志级别时应当返回它:
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"