我公开了一个枚举作为预先遍历遍历树结构的指南(迭代器使用这些枚举常量来决定如何遍历树):
/**
* 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”吗?
答案 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);