从不使用公共嵌套枚举?

我最近遇到了一个编码标准,声称你永远不应该在Java中使用公共内部枚举/类。这是我第一次遇到这个惯例,并且无法找到令人满意的解释。

我理解为什么应该避免使用公共内部类,但是出于什么原因,你永远不会使用公共嵌套枚举呢?或者,为什么这是一个不好的惯例?


答案 1

免责声明:以下不是硬性规定。这些只是我的观点和个人喜好。我个人发现它使我的代码更易于阅读和维护。

首先是一个问题。您是从哪里得到这个建议的?他们是否提供了任何理由?

根据我的经验,我通常使用私有嵌套枚举来增强代码的可读性和可维护性。当您执行与另一个系统的集成并且必须发送特定的字符串或数字时,这尤其有用。我发现使用枚举使内容更易于阅读和维护。在这种特定情况下,枚举传达的信息在范围上仅限于类(即,它在类之外没有意义,也没有其他人需要它)。

我想不出一个明确的理由来说明为什么公共内部枚举是一种不好的做法。但以下是我(通常)不使用它们的原因:

  • 如果枚举是公共的,它本质上意味着它在更大的范围内传达信息(即,在其父类的范围之外有意义,因此它可能意味着其他东西正在使用它)。如果是这种情况,那么使其成为独立的枚举可能更有意义。
  • 我发现眼睛更容易,而不是。没有理由不能适当地命名枚举以提供上下文,从而使其成为独立的枚举。ThirdPartyResponseCodes.SuccessThirdPartyIntegrationInterface.ThirdPartyResponseCodes.Success
  • 我想不使用公共内部类的相同原因也适用于公共内部枚举。首先,如果你有一个内部类,这可能意味着你的外部类可能会从重构中受益。也许你的外层阶级试图做太多?另一方面,封装和限制范围的好处是,特别是如果你可以提出这样的论点,即内部类仅在外部类的上下文中才有意义(如果它是私有的,则不言而喻)。如果它是一个公共内部类,那么这可能意味着它的范围超出了外部类,因此需要将其拉出。
  • 如果你确实需要使用公共嵌套枚举,那么你应该确切地记录为什么你需要它(我还没有找到这样做的理由),以及为什么最好把它保留为公共嵌套枚举而不是公共独立枚举。

答案 2

原因大概是它使这些枚举难以在声明它们的类之外使用,因为您必须使用封闭类的名称来限定它们。当然,对于任何公共内部阶级来说也是如此。我不确定我是否同意它 - 当然不是一个硬性规定。