H*r
2 楼
是不是这样:
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_;
...
}
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
4 楼
问题:一个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 {
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
6 楼
俺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。。。。
这样?
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
8 楼
我来逗逗闷子吧,别说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这样是不是最
这个最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
10 楼
好啊,先说下个人想法:
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。。。
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
11 楼
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。。。
{
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
12 楼
这个。。。你的问题是啥?
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; }
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; }
H*r
14 楼
嗯,这个不错,就是不太理解为啥还搞个map? 难道是因为array无法保证数据不会被修
改?
【在 Z*****Z 的大作中提到】
: 这个。。。你的问题是啥?
: http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.h
:
: ),
: ),
改?
【在 Z*****Z 的大作中提到】
: 这个。。。你的问题是啥?
: http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.h
:
: ),
: ),
S*h
19 楼
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.
beauty of ENUM. It limit your choice and avoid the misuse. It is also self
-document.
z*e
21 楼
这点小内存不用刻意去省,没有必要
我只在一种时候考虑过java的内存使用,当然内存泄露不算
就是在读取image的时候,因为image占的内存很大,而applet等一些小程序有内存限制
只有64m,所以我要考虑这个大小,其它的,只要是类的使用,不加载特别大东西的话
一般不需要考虑内存的使用
enum就是一个特殊的class
两个特征
1.内存中有限个
2.serializable
所以用enum可以很容易实现singleton
【在 H****r 的大作中提到】
: 谢好虫肯定!
: 如果用两个enum有浪费,或许可以只用一个enum CardId表示,rank和suit的结果都照
: CardId做reference.
我只在一种时候考虑过java的内存使用,当然内存泄露不算
就是在读取image的时候,因为image占的内存很大,而applet等一些小程序有内存限制
只有64m,所以我要考虑这个大小,其它的,只要是类的使用,不加载特别大东西的话
一般不需要考虑内存的使用
enum就是一个特殊的class
两个特征
1.内存中有限个
2.serializable
所以用enum可以很容易实现singleton
【在 H****r 的大作中提到】
: 谢好虫肯定!
: 如果用两个enum有浪费,或许可以只用一个enum CardId表示,rank和suit的结果都照
: CardId做reference.
相关阅读
ask a spring framework questionString[] a = c.toArray(new String[0])如何用java编一个安装程序?Linux下安装一个Java软件出现异常swing 在 mac intel 下的bug怎么修正?zt 京城各java培训机构比较关于颜色的改变有多少人对annotation这个东西不满,请举手!!斑竹有关AOL信箱的一个问题,急急急! (转载)怎么返回一个变量的地址?java.lang.LinkageError: loader constraints violated when linking javax/xml/namespace/QName classah, the "killer feature" of eclipsej2ee现在流行什么?apache axis2?Amazon is hiring experieced java developerwhat does "core java" mean?问个基本问题SYSDEO tomcat的问题。能够检查java程序中各个对象占用了多少内存吗?