2010-08-27 39 views
9

这似乎是一个简单的问题,但我在我的思维就枚举有点糊涂..Java的枚举的最佳实践

所以我有一个类 - 让我们说其所谓的DVD播放机 - 我想有表示它是ON,OFF或STANDBY的枚举。

所以我可以把这个枚举放在类中 - 它在类之外没有任何意义。我的问题是 - 如果枚举是公开的,以便其他类可以查询值,或者我应该使它私有,然后有“isOn”,“isOFf”和“isStandby”方法?

后者听起来有点愚蠢,但我不确定将enum公开为好是不是一个好主意。

回答

8

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

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

+0

我只是认为,除了DVDPlayer之外,国家不应该拥有它自己的生活 - 它只对DVDPlayer有意义。 – pecks 2010-08-27 08:33:26

+6

在同一时间,它可能。您可能有一个DvdPlayerRemoteControl,它对DvdPlayer可以具有的状态非常感兴趣。 – mikek 2010-08-27 08:37:20

+0

是真的。我已经将oder中的示例更改为在此发布,所以我可能没有想到它通过那么多! – pecks 2010-08-27 08:40:11

2

这取决于你想如何使用来自外界DVDPlayer类:

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

if (dvdPlayer.isOn()) 

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

+0

你是对的,这正是它所要涉及的。 – pecks 2010-08-27 08:34:09

+1

其实我更喜欢后者,因为isOn()的读取速度要快于围绕可能由状态表示的东西,因此您首先需要查看枚举。 – 2016-04-19 15:27:46

0

使枚举公开可能是有道理的。这样,你会是这样的:

DvdPlayer.State getState(); 

如果你只有三种状态,它可能是最好使用ISON,ISOFF和isStandby方法。对于更多的州来说,公共枚举更好。另外一个枚举可以用在switch语句中,这很方便。

2

作为一个经验法则,您希望尽可能保密(虽然通常情况下,这不是enums的用例),但从您提出的问题的方式来看,我不确定您是否使用枚举如预期。

你想使用枚举来表示固定值;将这些值保存为静态最终整数或字符串是更清洁的替代方法。因此,对于声明为

public enum DvdState { ON, OFF, STANDBY }; 

枚举您的类看起来有点像这样:

public class DvdPlayer { 
    private DvdState state = DvdState.OFF; 

    public void setState(DvdState state) { 
     this.state = state; 
    } 
} 

以及呼叫类将使用下面的代码:如果enum

dvdPlayer.setState(DvdState.ON); 
+0

这种思维方式很像过度工程。我想打开或关闭播放器。没有人会说她想改变或设置球员的状态...... – 2016-04-19 15:30:21

0

公共界面的一部分,声明它是有意义的public。这似乎是DVPlayer,因为你说它可以被查询。“isOn”,“is”“”和“isStandby”这三种方法“不必要地膨胀公共接口。

但有时当enum派上用场的类中使用,在这种情况下,它应该被宣布私人。例如,以下声明

private enum Format{DVD, BLURAY}; 

将是好的,如果格式是内部使用的DVD播放机类,但并不公共接口或者作为方法的一个参数或返回值的一部分。

0

我想我会是第一个主张在这里使用方法的人。首先,考虑你的班级的用户。他们需要了解的业务领域越少越好,因此不要将它们与“状态”等事物混淆。在现实生活中,你不会“设置DVD播放器的状态”,而只是“打开它”或“如果关闭”,这对我来说就是尖叫方法。除了Java被严格地静态类型知道和喜爱之外,它允许您仅通过IDE的自动完成建议来发现接口。读一个方法turnOff对我来说很有意义,而一个setState是不明确的,并且需要我先查找状态枚举,以便知道状态究竟是什么状态。