【问题标题】:Java enum best practiceJava 枚举最佳实践
【发布时间】:2010-08-27 08:22:58
【问题描述】:

这似乎是一个微不足道的问题,但我对枚举的想法有点混乱..

所以我有一个类 - 假设它称为 DVDPlayer - 我想要一个表示它是 ON、OFF 还是 STANDBY 的枚举。

所以我可以把枚举放在课堂上——它在课堂之外没有意义。我的问题是——枚举应该是公开的,以便其他类可以查询值,还是应该将其设为私有,然后使用“isOn”、“isOFF”和“isStandby”方法?

后者听起来有点愚蠢,但我不确定将枚举也公开是否是个好主意。

【问题讨论】:

    标签: java enums


    【解决方案1】:

    我会说将其公开似乎是个好主意。主要原因是应用程序更容易扩展,因为您不必在每次添加状态时都考虑添加新方法。

    如果您决定将其公开,则应考虑将其作为顶级枚举。我真的不明白你为什么说“在课堂之外没有意义”。我认为DVDPlayerState 听起来像是一个完美的公共/顶级枚举。

    【讨论】:

    • 我只是认为,除了 DVDPlayer,国家不应该有自己的生命——它只对 DVDPlayer 有意义。
    • 同时,它可能会。您可能有一个 DvdPlayerRemoteControl,它对 DvdPlayer 可以具有的状态非常感兴趣。
    • 真的。我已经更改了示例以将其发布在这里,所以我可能没有考虑那么多!
    【解决方案2】:

    这取决于你想如何从外部使用DVDPlayer 类:

    if (dvdPlayer.getState() == State.ON)
    

    或

    if (dvdPlayer.isOn())
    

    我认为第一个是更好的选择。您不必使用委托方法污染您的代码。

    【讨论】:

    • 实际上我更喜欢后者,因为 isOn() 的读取速度比将你的头脑围绕在一个状态可能意味着什么上要快得多,你首先需要查找枚举。跨度>
    【解决方案3】:

    根据经验,您希望尽可能保持隐私(尽管通常这不是枚举的用例),但从您提出问题的方式来看,我不确定您是否使用枚举有意的。

    您想使用枚举来表示固定值;将这些值保存为静态最终整数或字符串是一种更简洁的替代方法。所以对于声明为的枚举

    public enum DvdState { ON, OFF, STANDBY };
    

    你的班级看起来有点像这样:

    public class DvdPlayer {
        private DvdState state = DvdState.OFF;
    
        public void setState(DvdState state) {
            this.state = state;
        }
    }
    

    调用类将使用以下代码:

    dvdPlayer.setState(DvdState.ON);
    

    【讨论】:

    • 这种思维方式很像过度设计。我想打开或关闭播放器。没有人会说她想改变或设置玩家的状态......
    【解决方案4】:

    公开枚举是有意义的。然后你会得到这样的东西:

    DvdPlayer.State getState();
    

    如果您只有三种状态,则最好使用 isOn、isOff 和 isStandby 方法。对于更多州来说,公共枚举更好。也可以在 switch 语句中使用枚举,这很方便。

    【讨论】:

      【解决方案5】:

      如果enum 是公共接口的一部分,则将其声明为public 是有意义的。 DVPlayer似乎就是这样,因为你说它可以被查询。 “isOn”、“isOFf”和“isStandby”这三种方法不必要地使公共接口膨胀。

      但有时enum 会在类中派上用场,在这种情况下,它应该被声明为private。比如下面的声明

      private enum Format{DVD, BLURAY};
      

      没问题,如果 Format 在 DVDPlayer 类内部使用但不是公共接口的一部分,无论是作为参数还是方法的返回值。

      【讨论】:

        【解决方案6】:

        我想我会是第一个在这里提倡使用方法的人。首先,想想你班级的用户。他们需要了解的业务领域越少越好,所以不要将它们与“状态”之类的东西混淆。您不会在现实生活中“设置 DVD 播放器的状态”,而只是“打开它”或“如果关闭则关闭”,这对我来说是一种方法。除此之外,Java 因其严格的静态类型而闻名和喜爱,它允许您仅通过 IDE 的自动完成建议来发现接口。阅读 turnOff 方法对我来说立即有意义,而 setState 是模棱两可的,需要我先查找状态枚举,以便我知道状态实际上是什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-16
          • 2013-11-09
          • 2012-11-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-09
          • 2010-10-19
          • 2010-10-03
          相关资源
          最近更新 更多