轨道
/
Java
Java
/
练习
/
日志,日志,日志!
日志,日志,日志!

日志,日志,日志!

学习练习

简介

枚举

_枚举类型_是一种特殊的数据类型,它让变量的取值可以是一组预定义的常量。 变量必须等于为它预定义的值之一。 常见的例子包括指南针方向(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(致命)

你有三个任务。

1. 解析日志级别

定义一个 LogLevel 枚举,其中包含六个元素,分别对应上面的日志级别。

  • TRACE
  • DEBUG
  • INFO
  • WARNING
  • ERROR
  • FATAL

接下来,实现 LogLine.getLogLevel() 方法,返回一行日志解析后的日志级别:

var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO

2. 支持未知日志级别

遗憾的是,有时某些日志行会带有未知的日志级别。 为了妥善处理这些日志行,请向 LogLevel 枚举中添加一个 UNKNOWN 元素,在解析到未知日志级别时应当返回它:

var logLine = new LogLine("[XYZ]: Overly specific, out of context message");
logLine.getLogLevel();
// => LogLevel.UNKNOWN

3. 将日志行转换为短格式

一行日志的日志级别相当冗长。 为减少存储日志行所需的磁盘空间,我们设计了一种短格式:"[<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"
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Java Exercism

准备好开始 日志,日志,日志! 了吗?

注册 Exercism,借助 26 个概念158 个练习 和真人导师指导,学习并掌握 Java,全部免费。