当构造函数需要枚举时,如何实例化对象?

时间:2011-04-07 05:17:19

标签: java

我有一个使用可枚举数据类型的类。在它的构造函数中,它使用了其中的两个。当我尝试从另一个文件中实例化该类的对象时,我收到错误 以下是该类代码的一部分:

public class Card {
public static enum colorType {BLACK, RED};
public static enum suitType {CLUB, DIAMOND, HEART, SPADE };
public static enum rankType {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT,
        NINE, TEN, JACK, QUEEN, KING };
private boolean faceup = false;
private rankType rank;
private suitType suit;

//*************************************************************
//Card- constructor.  initializes a card and makes it face down
//*************************************************************
public void Card(rankType r, suitType s){
    this.rank = r;
    this.suit = s;
    this.faceup = false;
}

当我尝试这样做时:

Card C1 = new Card(ACE,SPADE);

从另一个文件,我收到一个错误。使用rankType.ACE和suitType.SPADE作为参数也会产生相同的错误。我可以做卡C1 =新卡();没有错误,但这将创建一个没有任何内容的卡。我得到的确切错误是:

internal error; cannot instantiate Card.<init> at Card to ()

显然在这种情况下使用可枚举有一些技巧。我做错了什么?
固定。我的问题的解决方案来自uthomas,Tieson T.和接受的答案。

4 个答案:

答案 0 :(得分:4)

尝试从构造函数中删除void关键字。

答案 1 :(得分:3)

您需要指定枚举的来源:

Card C1 = new Card(rankType.ACE, suitType.SPADE);

此外,您的枚举不应以小写字母开头。你也应该省略“类型”。所以这样做:

public static enum Color {BLACK, RED};
public static enum Suit {CLUB, DIAMOND, HEART, SPADE };
public static enum Rank {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING };

然后对构造函数的调用变为:

Card C1 = new Card(Rank.ACE, Suit.SPADE);

编辑:您还需要从构造函数中删除void,正如@uthomas所说。构造函数返回定义它们的对象类型。这就是为什么它们必须与类本身具有相同的名称。

答案 2 :(得分:2)

当删除void uthomas 时,您需要使用正确的枚举。 rankTypesuitTypeCard的内部类,因此如果要在类外部使用它们,则需要使用外部类名称作为前缀:

Card C1 = new Card(Card.rankType.ACE,Card.suitType.SPADE)

由于枚举是一个类,请遵循约定并以大写字母开头命名。

答案 3 :(得分:2)

由于枚举是在类中声明的,因此是内部类型,因此您必须使用外部类进行限定:

Card C1 = new Card(Card.rankType.ACE, Card.suitType.SPADE);

如果您在单独的类中定义枚举可能会更好,因此可以直接引用(类型)并使用您可以使用的import static RankType.*之类的静态导入:

Card C1 = new Card(ACE, SPADE);

同样从构造函数中删除void