我正在使用React-Native项目。在项目中,我需要定义200-300枚举。我想在Java中使用Enum,我也可以使用Enum作为immutable.js Map / Set中的键。这使我的代码很容易编写。但是,我可以用字符串替换这些Enum对象。现在我担心的是内存使用情况。我不知道对象是否会消耗大量内存。哪一个更好?有什么建议吗?
export class Enum {
static values() {
return Object.values(this).filter(value => value instanceof Enum);
}
static build() {
let count = 0;
for (const [key, value]: [string, any] of Object.entries(this)) {
if (value instanceof Enum) {
value._ordinal = count++;
value._name = key;
makeImmutable(value);
}
}
Object.freeze(this);
}
_ordinal: number;
_name: string;
name() {
return this._name;
}
ordinal() {
return this._ordinal;
}
toString() {
return JSON.stringify(this);
}
}
export class ReduxAction extends Enum {
static LOGIN = new ReduxAction();
static LOGOUT = new ReduxAction();
}
ReduxAction.build();
export function login() {
return {type: ReduxAction.LOGIN};
}
export class Game extends Enum {
static GAME_A = new Game('A', (data) => data.length);
static GAME_B = new Game('B', (data) => data.length * 2);
name: string;
countScore: Function;
constructor(name: string, countScore: Function) {
super();
this.name = name;
this.countScore = countScore;
}
}
答案 0 :(得分:1)
V8开发者在这里。当然,对象比字符串大(特别是因为在你的情况下,无论如何你都有字符串,问题是你是否还有一个对象)。对于代码段中的代码,Enum
的每个实例都应该是5个指针(对象标题为3个指针,_ordinal
和_name
属性为2个;因此对象大小为5 * 8位= 64位平台上的40字节)。对于每个"对象形状,还有一些内存成本。在程序中,在这种情况下,转换为"您定义的每个类"。
考虑到您所说的要求/目标,我会猜测内存成本是可以接受的。根据您构建代码的方式,还有可能为了在此处切换到字符串,您必须在其他地方使用更多内存来维护相同的功能或界面。
作为旁注:所有反射功能往往有些慢。例如,保持"值"列表作为一个数组,并在请求时将其发送出来比Object.values(this).filter(...instanceof...)
链快得多。但是,鉴于您说您为了简单编码而进行了优化,这可能是为了实现您想要的权衡而可以接受的另一个成本。