我正在将一副纸牌实现为单例,使用枚举,以便我可以从程序中的任何地方通用访问该纸牌。作为枚举构造函数的一部分,它用每张卡片洗牌一个数组列表并将它们全部推入堆栈(这似乎象征性地合适)。
什么时候调用构造函数?它是在运行时构建的吗?编译时间?我第一次打电话给枚举?我可以期望每次我运行程序时,这副纸牌都会正确随机化吗?
谢谢!
我正在将一副纸牌实现为单例,使用枚举,以便我可以从程序中的任何地方通用访问该纸牌。作为枚举构造函数的一部分,它用每张卡片洗牌一个数组列表并将它们全部推入堆栈(这似乎象征性地合适)。
什么时候调用构造函数?它是在运行时构建的吗?编译时间?我第一次打电话给枚举?我可以期望每次我运行程序时,这副纸牌都会正确随机化吗?
谢谢!
我认为你设计它的方式是错误的。表示一enum
组不应该具有全局功能的有限值。它们只是常量,可以为它们中的每一个提供功能,但再多的东西都不值得这样做。
直接在枚举构造函数(在任何情况下都会为每个常量调用)中将洗牌功能带到甲板上似乎不是正确的方法。
更好的解决方案是拥有 4 个不同的类,例如:
enum Suit {
HEARTS,
CLUBS,
..
}
enum Value {
ACE,
TWO,
..
}
class Card {
Suit suit;
Value value;
}
class Deck {
List<Card> cards;
public void shuffle() { .. }
}
您不应该为此使用单例。
但是要回答这个问题,构造函数是在类加载器加载枚举类(Deck)并初始化时调用的。因此,在任何代码行可以调用 Deck 类的任何方法之前,deck 将被洗牌。
对于每个枚举类型,构造函数在第一次按顺序初始化 Enum 类时被调用。