隐藏枚举常量

时间:2012-10-01 17:06:54

标签: java api

我公开了一个枚举作为预先遍历遍历树结构的指南(迭代器使用这些枚举常量来决定如何遍历树):

/**
 * The result type of an {@link IVisitor} implementation.
 * 
 * @author Johannes Lichtenberger, University of Konstanz
 */
public enum EVisitResult {
  /** Continue without visiting the siblings of this node. */
  SKIPSIBLINGS,

  /** Continue without visiting the descendants of this node. */
  SKIPSUBTREE,

  /** Continue traversal. */
  CONTINUE,

  /** Terminate traversal. */
  TERMINATE,

  /** Pop from the right sibling stack. */
  SKIPSUBTREEPOPSTACK
}

但是,最后一个枚举常量仅用于内部访问者,不应该使用公共API的用户使用。我有什么想法可以隐藏“SKIPSUBTREEPOPSTACK”吗?

2 个答案:

答案 0 :(得分:3)

您所能做的只是证明不应该使用它。

另一种方法是使用界面

public interface EVisitResult {
}

public enum PublicEVisitResult implements EVisitResult {
  /** Continue without visiting the siblings of this node. */
  SKIPSIBLINGS,

  /** Continue without visiting the descendants of this node. */
  SKIPSUBTREE,

  /** Continue traversal. */
  CONTINUE,

  /** Terminate traversal. */
  TERMINATE,
}

enum LocalEVisitResult implements EVisitResult {
  /** Pop from the right sibling stack. */
  SKIPSUBTREEPOPSTACK
}

答案 1 :(得分:1)

如果你想要枚举公共API和内部实现,你可以有2个枚举

private enum InternalFoo
    foo1
    foo2
    foox

private void doFoo(InternalFoo foo)
    switch(foo)
        case foo1
        ...


-----


public enum Foo
    foo1(InternalFoo.foo1)
    foo2(InternalFoo.foo2)
    // no foox

    InternalFoo internal;
    Foo(InternalFoo internal){ this.internal=internal; }

public void doFoo(Foo foo)
    doFoo(foo.internal);