【发布时间】:2016-07-19 06:58:10
【问题描述】:
我有一个“配置”类,它成为其他几个类的字段。它表示那些其他类的某种配置或“能力”以允许或禁止操作。到目前为止,配置类包含一组四个独立的布尔值,并且可能会保持这种状态——或者随着另一个布尔值增长——。配置是不可变的:对象一旦创建,配置就永远不会改变。
public class Configuration {
private final boolean abilityOne;
private final boolean abilityTwo;
private final boolean abilityThree;
private final boolean abilityFour;
public Configuration (final boolean abilityOne, final boolean abilityTwo,
final boolean abilityThree, final boolean abilityFour) {
this.configuration = ((1 * (abilityOne ? 1 : 0)) +
(2 * (abilityTwo ? 1 : 0)) +
(4 * (abilityThree ? 1 : 0)) +
(8 * (abilityFour ? 1 : 0)));
}
public boolean isAbilityOne() {
return((1 & this.configuration) > 0);
}
public boolean isAbilityTwo() {
return((2 & this.configuration) > 0);
}
public boolean isAbilityThree() {
return((4 & this.configuration) > 0);
}
public boolean isAbilityFour() {
return((8 & this.configuration) > 0);
}
}
由于 C / 有限硬件背景,我的下一个实现(尝试减少内存占用)是使用 int 作为位图:1 -> 第一个布尔值,2-> 第二个,4 -> 第三个, 8-> 第四。这样我存储一个整数,我需要的布尔函数如下:
它工作正常,而且内存效率很高。但我的 Java-all-my-life 同事对此并不满意。
不同配置的数量是有限的(布尔值的组合),但是使用它们的对象数量非常多。为了减少内存消耗,我想到了某种“多单例”、枚举或缓存实例。这就是我现在的位置。什么是最好的?
【问题讨论】:
-
第一件事:您应该更多地担心好的设计,而不是“内存效率”。在没有真正问题的情况下优化代码......通常会导致不合标准的代码。在您的情况下:仅将配置表示为一组 4 个布尔值的想法......听起来有点奇怪。仅使用 4 个布尔值的列表会有什么问题?
-
这些对象的创建成本高吗?如果是,请使用
enum。如果没有,只需创建允许创建多个实例,并覆盖equals/hashCode。 -
“我的 Java-all-my-life 同事不赞成”请他们解释他们的保留意见。
-
顺便说一下,如果您是 Java 新手,我强烈建议您阅读 Josh Bloch 编写的 Effective Java 2nd Ed - 它可能会帮助您理解您所使用的成语同事。特别是,第 32 条与这个问题有关。
-
@Jägermeister 对。但是我们必须在 RAM 中加载大约 6k 的对象才能运行,目前我们可以在 4GB 中为 JVM 保留大约 3K 的对象。在真正的问题之前,这肯定不是。当然,我的 one-int-implementation 只在 RAM 中多获得了 10% 的对象,所以这并没有太大的改进。
标签: java enums singleton factory-pattern