这似乎是一个简单的问题,但我在我的思维就枚举有点糊涂..Java的枚举的最佳实践
所以我有一个类 - 让我们说其所谓的DVD播放机 - 我想有表示它是ON,OFF或STANDBY的枚举。
所以我可以把这个枚举放在类中 - 它在类之外没有任何意义。我的问题是 - 如果枚举是公开的,以便其他类可以查询值,或者我应该使它私有,然后有“isOn”,“isOFf”和“isStandby”方法?
后者听起来有点愚蠢,但我不确定将enum公开为好是不是一个好主意。
这似乎是一个简单的问题,但我在我的思维就枚举有点糊涂..Java的枚举的最佳实践
所以我有一个类 - 让我们说其所谓的DVD播放机 - 我想有表示它是ON,OFF或STANDBY的枚举。
所以我可以把这个枚举放在类中 - 它在类之外没有任何意义。我的问题是 - 如果枚举是公开的,以便其他类可以查询值,或者我应该使它私有,然后有“isOn”,“isOFf”和“isStandby”方法?
后者听起来有点愚蠢,但我不确定将enum公开为好是不是一个好主意。
我会说这似乎是一个好主意,使其公开。主要原因是应用程序更容易扩展,因为每次添加状态时都不必考虑添加新方法。
如果您决定公开,您应该考虑将其作为顶级枚举。我真的不明白你为什么说“它在课堂以外没有意义”。我认为DVDPlayerState
听起来像一个完美的公共/顶级枚举。
这取决于你想如何使用来自外界DVDPlayer
类:
if (dvdPlayer.getState() == State.ON)
或
if (dvdPlayer.isOn())
我第一个想到的是一个更好的选择。您不必使用委托方法污染代码。
你是对的,这正是它所要涉及的。 – pecks 2010-08-27 08:34:09
其实我更喜欢后者,因为isOn()的读取速度要快于围绕可能由状态表示的东西,因此您首先需要查看枚举。 – 2016-04-19 15:27:46
使枚举公开可能是有道理的。这样,你会是这样的:
DvdPlayer.State getState();
如果你只有三种状态,它可能是最好使用ISON,ISOFF和isStandby方法。对于更多的州来说,公共枚举更好。另外一个枚举可以用在switch语句中,这很方便。
作为一个经验法则,您希望尽可能保密(虽然通常情况下,这不是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);
这种思维方式很像过度工程。我想打开或关闭播放器。没有人会说她想改变或设置球员的状态...... – 2016-04-19 15:30:21
公共界面的一部分,声明它是有意义的public。这似乎是DVPlayer,因为你说它可以被查询。“isOn”,“is”“”和“isStandby”这三种方法“不必要地膨胀公共接口。
但有时当enum
派上用场的类中使用,在这种情况下,它应该被宣布私人。例如,以下声明
private enum Format{DVD, BLURAY};
将是好的,如果格式是内部使用的DVD播放机类,但并不公共接口或者作为方法的一个参数或返回值的一部分。
我想我会是第一个主张在这里使用方法的人。首先,考虑你的班级的用户。他们需要了解的业务领域越少越好,因此不要将它们与“状态”等事物混淆。在现实生活中,你不会“设置DVD播放器的状态”,而只是“打开它”或“如果关闭”,这对我来说就是尖叫方法。除了Java被严格地静态类型知道和喜爱之外,它允许您仅通过IDE的自动完成建议来发现接口。读一个方法turnOff
对我来说很有意义,而一个setState
是不明确的,并且需要我先查找状态枚举,以便知道状态究竟是什么状态。
我只是认为,除了DVDPlayer之外,国家不应该拥有它自己的生活 - 它只对DVDPlayer有意义。 – pecks 2010-08-27 08:33:26
在同一时间,它可能。您可能有一个DvdPlayerRemoteControl,它对DvdPlayer可以具有的状态非常感兴趣。 – mikek 2010-08-27 08:37:20
是真的。我已经将oder中的示例更改为在此发布,所以我可能没有想到它通过那么多! – pecks 2010-08-27 08:40:11