gpt4 book ai didi

java - 经典方法抛出 AbstractMethodError VS 抽象方法

转载 作者:行者123 更新时间:2023-11-30 07:14:39 25 4
gpt4 key购买 nike

我刚刚查看了 TimeUnit enum源代码(在下面进行了简化):

public enum TimeUnit {

SECONDS {
public long toMillis(long d) { return d * 1000L; }
},
MINUTES {
public long toMillis(long d) { return d * 60000L; }
};

public long toMillis(long duration) {
throw new AbstractMethodError();
}

}

他们也可以使用抽象方法实现它:

public enum TimeUnit {

SECONDS {...}, MINUTES {...};

public abstract long toMillis(long duration);

}

既然他们选择了第一个实现,我想一定是有原因的。因此,我的问题是:为什么? AbstractMethodError 会被抛出吗?如果是,在哪种情况下?

最佳答案

标准的 doclet(即 Sun/Oracle 变体)在 Javadoc 输出中不呈现 abstract 枚举方法。如果这些方法是抽象的,Javadoc 将不会显示它们的踪迹。这个错误仍然存​​在,最初是在 2005 年(9 多年前)报告的:

JDK-6287639:枚举类中的抽象方法不应列为抽象 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6287639

如果要实现正确的行为,这些方法将出现在 Javadoc 输出中,并删除抽象关键字。枚举值本质上是枚举类的匿名子类,因此 javac 确保枚举值实现每个抽象方法。因此,从外部观察者的角度来看,抽象枚举方法实际上是非抽象的。

在 TimeUnit 的实现中编写的以下注释提供了更多的见解:

// To maintain full signature compatibility with 1.5, and to improve the
// clarity of the generated javadoc (see 6287639: Abstract methods in
// enum classes should not be listed as abstract), method convert
// etc. are not declared abstract but otherwise act as abstract methods.

如果 Javadoc 对您的项目很重要,您可能需要考虑跟随 TimeUnit 的脚步。

关于java - 经典方法抛出 AbstractMethodError VS 抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18360792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com