Java TimeUnit.class枚举操作是如何工作的?

Java TimeUnit.class枚举操作是如何工作的?,java,enums,Java,Enums,TimeUnitAPI中的枚举是如何工作的?特别是下面的语法是什么意思 public enum Name { CONSTANT { } } 我一直在学习enum教程,但它并没有真正深入到上述语法的细节。常数中的东西是什么?它是一个有自己方法的匿名类吗?那么常数之外的所有这些方法是什么?我很困惑。在{}中,实现了“抽象”方法。 将其视为一个类的主体,并以“Name”为例进行扩展。 因此,如果您在Name中有一个方法,那么 public String someMethod(){ throw

TimeUnitAPI中的枚举是如何工作的?特别是下面的语法是什么意思

public enum Name {
    CONSTANT { }
}

我一直在学习enum教程,但它并没有真正深入到上述语法的细节。常数中的东西是什么?它是一个有自己方法的匿名类吗?那么常数之外的所有这些方法是什么?我很困惑。

{}
中,实现了“抽象”方法。 将其视为一个类的主体,并以“Name”为例进行扩展。 因此,如果您在
Name
中有一个方法,那么

public String someMethod(){ throw new AbstractMethodError(); /*Or default implementation.*/ }
那么你就必须在

CONSTANT{
    public String someMethod() {  return "green eggs and ham"; }
}

这就是在时间单位中所做的-它定义了转换不同单位的抽象方法,元素实现了它们大小的转换方法。

枚举也是类,它们的常量可以被视为类的实例。如果你看一个普通的类,如果你做了如下事情:

Clz obj = new Clz() {}

您正在创建一个匿名子类。枚举值也是如此。枚举值之外的方法是可用于所有枚举值的方法(如有,请考虑具有默认实现的公共接口)。如果要覆盖特定枚举值的方法,这就是解决方法。

让我直说吧。在{}中是枚举的扩展,因此任何定义为抽象的枚举方法也必须实现。就时间单位而言,它是“excessNano(long,long)”方法——这是唯一定义为抽象的方法。{}中的所有其他方法基本上只是覆盖现有的枚举方法。。。所以本质上,枚举常量可以是枚举中的匿名类。他们能有自己的方法吗?如果是这样,为什么还要在枚举中声明方法,为什么不在常量中声明它们呢?枚举类就是“接口”。对于每个常量,通常不需要不同的方法。但在时间单位中,您可能需要相同方法的不同实现。这就是将秒转换为毫秒,将分钟转换为毫秒,依此类推。是的,它是压倒一切的。只是在TimeUnit中(至少在OpenJDK实现中),一些方法通过抛出AbstractMethodError而变得抽象。这就是为什么我把抽象放在“…如果它是“接口”,为什么一些方法被排除在实现之外?例如timedWait()、timedJoin()和sleep()。只是澄清一下…如果我删除常量中的toNano、toMicros等,这仍然是合法的,对吗?timedWait()是默认实现的一个示例。所有的“常量”“分享这一执行情况。如果删除其中一个覆盖(例如toNano),它将从默认实现中抛出“AbstractMethodError”。但是,如果您删除了该抛出并用一些法律代码替换它,那么它很可能不再执行它应该执行的操作,而是编译并执行。