H****r 发帖数: 2801 | 1 是不是这样:
public class Card {
public enum Rank { DEUCE, ... , ACE }
public enum Suit { ... }
private final Rank rank;
private final Suit suit;
...
}
这样每个Card 的object只占用两个enum的内存?如果写成下面这样能更少不?
public class CardDetail {
public enum Rank { DEUCE, ... , ACE }
public enum Suit { ... }
private final Rank rank;
private final Suit suit;
...
}
public class Card {
private static final CardDetail[] = { ... }; // standard 52 cards
private final CardDetail card_;
...
} | Z*****Z 发帖数: 723 | 2 问题:一个enum有多大?我前一阵子序列化过一个enum,好像挺大的。。。
efficient的话,一个0到52之间的整数就能表示一张牌,一个byte。。。。
【在 H****r 的大作中提到】 : 是不是这样: : public class Card { : public enum Rank { DEUCE, ... , ACE } : public enum Suit { ... } : private final Rank rank; : private final Suit suit; : ... : } : 这样每个Card 的object只占用两个enum的内存?如果写成下面这样能更少不? : public class CardDetail {
| H****r 发帖数: 2801 | 3 俺java新人,轻拍...
这样?
public class Card {
private static final CardDetail[] cards = { ... }; // standard cards
private final byte cardId; //
...
Suit getSuit() { return cards[cardId].Suit(); }
...
}
这里如果cards直接初始化为标准52张牌,用cardId来实现getter/setter这样是不是最
compact?
【在 Z*****Z 的大作中提到】 : 问题:一个enum有多大?我前一阵子序列化过一个enum,好像挺大的。。。 : efficient的话,一个0到52之间的整数就能表示一张牌,一个byte。。。。
| Z*****Z 发帖数: 723 | 4 我来逗逗闷子吧,别说Java了,拣一门你最熟练最顺手的语言,或者自然语言也行,写
这个最efficient的card应该怎么写?然后我们可以把它改成Java。。。
【在 H****r 的大作中提到】 : 俺java新人,轻拍... : 这样? : public class Card { : private static final CardDetail[] cards = { ... }; // standard cards : private final byte cardId; // : ... : Suit getSuit() { return cards[cardId].Suit(); } : ... : } : 这里如果cards直接初始化为标准52张牌,用cardId来实现getter/setter这样是不是最
| H****r 发帖数: 2801 | 5 好啊,先说下个人想法:
Card有rank和suit, 分别可以用enum Rank, enum Suit来表示。
标准的playing cards包括4种花色和13种rank的所有组合,再加上2张jokers,共54张
。这54张牌组成一个static const array常驻内存singleton.
每次实际用到Card的地方实际都是一个reference以到这个singleton里查询rank和suit
, 这样只需要一个handle即可。 54张牌的话这个handle可以用byte?
这里偶还不太了解java如何实现const array以及如何合理使用handle. 刚刚写了个用
array的似乎不被肯定啊...
【在 Z*****Z 的大作中提到】 : 我来逗逗闷子吧,别说Java了,拣一门你最熟练最顺手的语言,或者自然语言也行,写 : 这个最efficient的card应该怎么写?然后我们可以把它改成Java。。。
| H****r 发帖数: 2801 | 6 public class Card
{
public static final int NUM_UNIQUE_CARDS = 54;
public enum Rank { ACE(1), DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6),
SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(11), QUEEN(12), KING(13),
JOKERONE(14), JOKERTWO(15); // including two jokers
private final int value; // face value
Rank(int faceValue) { value = faceValue; }
public int value() { return value; }
}
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES, JOKER } // including
joker
private final Rank rank;
private final Suit suit;
private Card(Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
public Rank rank() { return rank; }
public Suit suit() { return suit; }
public String toString() { return rank + " of " + suit; }
// protoCards define different cards, use it when assembling decks
public static Card[] protoCards = new Card[NUM_UNIQUE_CARDS]; // hard
coded protoCards
static // Initialize protoCards
{
Rank[] ranks = { Rank.ACE, Rank.DEUCE, Rank.THREE, Rank.FOUR, Rank.
FIVE, Rank.SIX,
Rank.SEVEN, Rank.EIGHT, Rank.NINE, Rank.TEN, Rank.JACK, Rank.
QUEEN, Rank.KING };
Suit[] suits = { Suit.CLUBS, Suit.DIAMONDS, Suit.HEARTS, Suit.SPADES
};
int index = 0;
for(Suit suit : suits)
{
for(Rank rank : ranks)
{
protoCards[index++] = new Card(rank, suit);
}
}
protoCards[index++] = new Card(Rank.JOKERONE, Suit.JOKER);
protoCards[index] = new Card(Rank.JOKERTWO, Suit.JOKER);
}
public static final Card[] getUniqueCards()
{
return protoCards;
}
}
【在 Z*****Z 的大作中提到】 : 我来逗逗闷子吧,别说Java了,拣一门你最熟练最顺手的语言,或者自然语言也行,写 : 这个最efficient的card应该怎么写?然后我们可以把它改成Java。。。
| Z*****Z 发帖数: 723 | 7 这个。。。你的问题是啥?
http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.h
),
),
【在 H****r 的大作中提到】 : public class Card : { : public static final int NUM_UNIQUE_CARDS = 54; : public enum Rank { ACE(1), DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6), : SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(11), QUEEN(12), KING(13), : JOKERONE(14), JOKERTWO(15); // including two jokers : : private final int value; // face value : Rank(int faceValue) { value = faceValue; } : public int value() { return value; }
| g*****g 发帖数: 34805 | 8 enum挺好,不大。52张牌,存储不需要什么优化。
【在 Z*****Z 的大作中提到】 : 问题:一个enum有多大?我前一阵子序列化过一个enum,好像挺大的。。。 : efficient的话,一个0到52之间的整数就能表示一张牌,一个byte。。。。
|
| H****r 发帖数: 2801 | 9 嗯,这个不错,就是不太理解为啥还搞个map? 难道是因为array无法保证数据不会被修
改?
【在 Z*****Z 的大作中提到】 : 这个。。。你的问题是啥? : http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.h : : ), : ),
| H****r 发帖数: 2801 | 10 谢好虫肯定!
如果用两个enum有浪费,或许可以只用一个enum CardId表示,rank和suit的结果都照
CardId做reference.
【在 g*****g 的大作中提到】 : enum挺好,不大。52张牌,存储不需要什么优化。
| | | Z*****Z 发帖数: 723 | 11 我刚才测试了一下,Hector的实现要是加上Serializable接口,序列化之后大小是72字
节。如果改用一个int或者byte实现的话,大小是30几字节。我猜想enum或许不大,但是
序列化的时候还要序列化enum的定义,可能20几字节吧?
【在 g*****g 的大作中提到】 : enum挺好,不大。52张牌,存储不需要什么优化。
| g*****g 发帖数: 34805 | 12 你是不是面试题做太多了?真正实践里,最重要的是可维护。
接口清晰,结构简单,才是关键。52Million个数据,考虑一下
存储大小说得过去,52个,根本不用考虑。
但是
【在 Z*****Z 的大作中提到】 : 我刚才测试了一下,Hector的实现要是加上Serializable接口,序列化之后大小是72字 : 节。如果改用一个int或者byte实现的话,大小是30几字节。我猜想enum或许不大,但是 : 序列化的时候还要序列化enum的定义,可能20几字节吧?
| Z*****Z 发帖数: 723 | 13 虫哥别生气。。。我没有一点儿说enum不好的。。。要是我写,我也会写enum。。。只
是逗逗闷子而已。。。
【在 g*****g 的大作中提到】 : 你是不是面试题做太多了?真正实践里,最重要的是可维护。 : 接口清晰,结构简单,才是关键。52Million个数据,考虑一下 : 存储大小说得过去,52个,根本不用考虑。 : : 但是
| S****h 发帖数: 558 | 14 In the practice, I would make my API as specific as possible. That is the
beauty of ENUM. It limit your choice and avoid the misuse. It is also self
-document. | z****e 发帖数: 54598 | 15 enum不需要序列化
【在 Z*****Z 的大作中提到】 : 问题:一个enum有多大?我前一阵子序列化过一个enum,好像挺大的。。。 : efficient的话,一个0到52之间的整数就能表示一张牌,一个byte。。。。
| z****e 发帖数: 54598 | 16 这点小内存不用刻意去省,没有必要
我只在一种时候考虑过java的内存使用,当然内存泄露不算
就是在读取image的时候,因为image占的内存很大,而applet等一些小程序有内存限制
只有64m,所以我要考虑这个大小,其它的,只要是类的使用,不加载特别大东西的话
一般不需要考虑内存的使用
enum就是一个特殊的class
两个特征
1.内存中有限个
2.serializable
所以用enum可以很容易实现singleton
【在 H****r 的大作中提到】 : 谢好虫肯定! : 如果用两个enum有浪费,或许可以只用一个enum CardId表示,rank和suit的结果都照 : CardId做reference.
| H****r 发帖数: 2801 | 17 赞回复
【在 z****e 的大作中提到】 : 这点小内存不用刻意去省,没有必要 : 我只在一种时候考虑过java的内存使用,当然内存泄露不算 : 就是在读取image的时候,因为image占的内存很大,而applet等一些小程序有内存限制 : 只有64m,所以我要考虑这个大小,其它的,只要是类的使用,不加载特别大东西的话 : 一般不需要考虑内存的使用 : enum就是一个特殊的class : 两个特征 : 1.内存中有限个 : 2.serializable : 所以用enum可以很容易实现singleton
|
|