Java枚举最佳实践

13

这个问题可能看起来微不足道,但我对枚举有些困惑。

所以我有一个类 - 假设它叫做DVDPlayer - 我想要有一个枚举表示它是开着的、关着的还是待机。

所以我可以把枚举放在类里面 - 在类外部没有意义。我的问题是 - 枚举应该是公共的,这样其他类就可以查询值,还是应该将其设置为私有的,然后再加上 "isOn"、"isOff" 和 "isStandby" 方法呢?

后者听起来有些傻,但我不确定将枚举设置为公共的是否是一个好主意。

6个回答

9
我认为将其公开似乎是个好主意。主要原因是该应用程序更容易扩展,因为每次添加状态时无需考虑添加新方法。
如果您决定将其公开,可以考虑将其作为顶级枚举。我真的不明白为什么您会说“它在类外没有意义”。我认为DVDPlayerState听起来像一个完全合适的公共/顶级枚举。

我只是认为状态除了DVD播放器之外不应该有自己的生命 - 它只与DVD播放器相关。 - pecks
6
同时,这可能会发生。你可能有一个对DvdPlayer能够具备哪些状态非常感兴趣的DvdPlayerRemoteControl。 - mikek
我已经更改了示例以在此处发布,因此可能没有仔细考虑! - pecks

2

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

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

或者

if (dvdPlayer.isOn())

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


2
实际上,我更喜欢后者,因为 isOn() 的读取速度比理解状态可能意味着什么要快得多,而这需要首先查找枚举。 - Hubert Grzeskowiak

2
作为一个经验法则,您希望尽可能保持私密性(尽管通常情况下,这不是枚举的使用情况),但从您提出问题的方式来看,我不确定您是否按照预期使用枚举。
您想使用枚举表示固定值;这是将这些值保存为静态最终整数或字符串的更清晰的替代方案。因此,对于声明为枚举的枚举,您需要使用:
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);

这种思维方式感觉很像过度设计。我想要打开或关闭一个玩家。没有人会说她想要改变或设置玩家的状态... - Hubert Grzeskowiak

0
将枚举公开可能是有意义的。然后你会得到这样的东西:
DvdPlayer.State getState();

如果你只有三种状态,最好使用isOn、isOff和isStandby方法。对于更多的状态,public enum更好。此外,枚举可以在switch语句中使用,这很方便。


0
如果enum是公共接口的一部分,将其声明为public是有意义的。这似乎是DVPlayer的情况,因为您说它可以被查询。三个方法“isOn”,“isOFf”和“isStandby”不必要地膨胀了公共接口。
但是,在某些情况下,enum在类内部使用时非常方便,此时应将其声明为private。例如,以下声明
private enum Format{DVD, BLURAY};

如果FormatDVDPlayer类内部使用,但不作为方法的参数或返回值的公共接口的一部分,那就可以了。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接