如何在Java中封装枚举

时间:2013-02-08 00:28:42

标签: java oop enums encapsulation

我正在尝试创建一个StandardCard类,它使用枚举套装和数字。我有下面的代码。

我的问题是,驱动程序类可以访问枚举,它将卡添加到卡组中。在阅读了最近的设计模式后,我觉得我应该有一个StandardCardEnums类,并在StandardCard类中创建该类的对象以添加模块性。这是要走的路吗?当我需要做像

这样的事情时,感觉很笨拙
StandardCardEnum myEnums = new StandardCardEnum;
private StandardCardEnum.Suit suit;
etc.....

我目前的代码如下,我看到的问题是 1)枚举在卡类中是硬编码的,重复肯定会发生 2)Driver类需要知道枚举以填充卡片中的卡片,因此违反了对象封装。

任何有经验的人都可以指出我开始适用于这些类型的情况的良好标准吗?我正试图从编程转向软件开发。我希望能够创建一个模块化的卡片游戏框架,这将允许我以最少的努力添加不同的纸牌游戏,甚至卡片组合和卡片类型。

public class StandardCard extends Card
{
public enum Suit {CLUBS, DIAMONDS, HEARTS , SPADES };
public enum Number {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING};

private Suit suit;
private Number number;

public StandardCard(StandardCard.Suit suit, StandardCard.Number number)
{
    this.suit = suit;
    this.number = number;
}

public StandardCard()
{
}

public Suit getSuit()
{
    return suit;
}

public Number getNumber()
{
    return number;
}

public void setSuit(Suit s)
{
    this.suit = s;
}

public void setNumber(Number n)
{
    this.number = n;
}
}

2 个答案:

答案 0 :(得分:2)

将枚举作为顶级类放入自己的文件中。

答案 1 :(得分:1)

您应该制作枚举static

public static enum Suit {CLUBS, DIAMONDS, HEARTS , SPADES };
public static enum Number {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING};

通过这种方式,您可以从代码中的任何位置StandardCard.Suit.CLUBS访问它们(例如来自Driver),但它们仍然封装在StandardCard中 - 它们在这个世界之外没有任何意义