如何在java中引用枚举的元素的方法

slmsl1lt  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(160)

给定一个枚举类E,包含元素AB以及方法m,如何在javadoc中引用E.A.m?如果必须提及m特定于A的属性,则会出现此问题。特别是,如果E.mA覆盖,或者如果E.m是抽象且每个元素提供其自己的实现。

7uhlpewt

7uhlpewt1#

这在目前的Java中是不可能的,原因非常明确,简而言之,示例中的AB都是instance,Java不允许示例使用JavaDoc。
Java中的enum实际上是1.5之前的Java版本中非常常见的设计模式的语法糖(加上一些***非常强大的***功能)。
常见的设计模式是当我们想要拥有一个class,并且instances的数量非常 * 受限 * 和 * 有限 * 的时候。大多数类允许你在内存允许的范围内创建尽可能多的instances。但是一个***枚举***类型有一个已知的、有限的(通常很小)instances数量。
这里最重要的单词是instance,考虑下面的代码。

public enum E
   {
   
      A,
      B,
      ;
      
   }

在上面的例子中,E是一个类,特别是enum类。***然而,A和B仅仅是EINSTANCES。它们不是子类。就Java所知,它们不是任何类型。它们只不过是如果你说了下面的话。

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

}

这一点很重要,因为在Java中,javadoc只为***types/fields/etc***编写了文档,而没有为***类型的匿名示例编写文档。想一想,要使m具有不同的功能,必须为E创建一个匿名类,然后为每个示例重写::m的实现。
因此,这是允许的,并将显示在JavaDoc上。

public enum E
   {
   
      /** This is documentation for A. */A,
      /** This is documentation for B. */B,
      ;
      
   }

但这只是Java允许的范围,枚举内部的任何内容都被认为是匿名示例特定的属性,因此不会得到任何JavaDoc。
如果您发现自己处于需要细粒度级别文档的情况下,为什么不创建一个密封的层次结构呢?类似这样的东西可以实现与enum类似的功能,只是不包括enum的开箱即用的所有强大特性(EnumSetEnumMapEnum::values等)。
下面是一个密封层次结构的示例,它具有enum所具有的一些特性。

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() {}
   
   }

这是从下面的类生成的JavaDoc。

现在我们看到A::m有自己的JavaDoc。
如果你想限制可以创建的示例,你可以只使用单例设计模式,而把E变成abstract class

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() {}
   
   }

就像这样,你已经重新创建了一个枚举(只是最基本的特性),如果你愿意,你可以添加一个::ordinal::values方法,但是这可能是你所能做的最多的了。

相关问题