2

此问题与(但不重复)为什么泄漏内部类型的公共 API 的编译不会失败?

如何定义只能从内部类访问的枚举方法?

具体来说:

  • 用户需要能够将enum值传递给 API 的其他部分。
  • 根据enum用户传递的值,内部类需要调用不同的操作。
  • 为了确保每个enum值都映射到一个操作,我们在enum.

影响:

  • enum必须public和导出。
  • 内部类必须驻留在单独的包中,enum以防止它们被导出。
  • enum方法必须public供内部类调用。

我能想到的阻止用户调用该public方法的唯一方法是让它引用非导出的类型。例如:

public enum Color
{
  RED
  {
    public void operation(NotExported ignore)
    {
      // ...
    }
  },
  GREEN,
  {
    public void operation(NotExported ignore)
    {
      // ...
    }
  },
  BLUE;
  {
    public void operation(NotExported ignore)
    {
      // ...
    }
  };

  /**
   * Carries out an internal operation.
   *
   * @param ignore prevent users from invoking this method
   */
  public abstract void operation(NotExported ignore);
}

不幸的是,当我这样做时,编译器会抱怨导出的 API 引用了非导出的类型。有一个更好的方法吗?

4

1 回答 1

0

Alan Bateman指出了JDK 使用的共享秘密机制。这允许内部类在不使用反射的情况下跨包共享包保护的方法。

于 2017-10-13T05:42:53.520 回答