public class E
{
public static final A = new E();
public static final B = new E();
//whatever other functionality enums provide for you out of the box
}
public sealed class E
{
/** E's implementation of m. */
void m() {}
}
public final class A extends E
{
/** A's implementation of m. */
void m() {}
}
public final class B extends E
{
@Override
void m() {}
}
public abstract static sealed class E
{
/** E's implementation of m. */
abstract void m();
}
public static final class A extends E
{
public static final A SINGLETON = new A();
private A(){}
/** A's implementation of m. */
void m() {}
}
public static final class B extends E
{
public static final B SINGLETON = new B();
private B(){}
@Override
void m() {}
}
1条答案
按热度按时间7uhlpewt1#
这在目前的Java中是不可能的,原因非常明确,简而言之,示例中的
A
和B
都是instance
,Java不允许示例使用JavaDoc。Java中的
enum
实际上是1.5之前的Java版本中非常常见的设计模式的语法糖(加上一些***非常强大的***功能)。常见的设计模式是当我们想要拥有一个
class
,并且instances
的数量非常 * 受限 * 和 * 有限 * 的时候。大多数类允许你在内存允许的范围内创建尽可能多的instances
。但是一个***枚举***类型有一个已知的、有限的(通常很小)instances
数量。这里最重要的单词是
instance
,考虑下面的代码。在上面的例子中,
E
是一个类,特别是enum
类。***然而,A和B仅仅是E
的INSTANCES
。它们不是子类。就Java所知,它们不是任何类型。它们只不过是如果你说了下面的话。这一点很重要,因为在Java中,javadoc只为***types/fields/etc***编写了文档,而没有为***类型的匿名示例编写文档。想一想,要使
m
具有不同的功能,必须为E
创建一个匿名类,然后为每个示例重写::m
的实现。因此,这是允许的,并将显示在JavaDoc上。
但这只是Java允许的范围,枚举内部的任何内容都被认为是匿名示例特定的属性,因此不会得到任何JavaDoc。
如果您发现自己处于需要细粒度级别文档的情况下,为什么不创建一个密封的层次结构呢?类似这样的东西可以实现与
enum
类似的功能,只是不包括enum的开箱即用的所有强大特性(EnumSet
、EnumMap
、Enum::values
等)。下面是一个密封层次结构的示例,它具有
enum
所具有的一些特性。这是从下面的类生成的JavaDoc。
现在我们看到
A::m
有自己的JavaDoc。如果你想限制可以创建的示例,你可以只使用单例设计模式,而把
E
变成abstract class
。就像这样,你已经重新创建了一个枚举(只是最基本的特性),如果你愿意,你可以添加一个
::ordinal
或::values
方法,但是这可能是你所能做的最多的了。