缓存枚举值
Caching enum values
我有更多枚举和一些值,我想问你缓存枚举值的方法是什么:
例如:
public enum Animal {
Dog, Cat, Cow;
static Animal[] values;
static EnumSet<Animal> cachedAnimalsEnumSet;
static List<Animal> cachedAnimalsList;
static {
values = values();
cachedAnimalsEnumSet = EnumSet.allOf(Animal.class);
cachedAnimalsList = Arrays.asList(Animal.values());
}
}
哪种方法最好:
值,cachedAnimalsEnumSet 或 cachedAnimalsList ?
假设您缓存的目的是避免每次调用 Animal.values() 时都创建新数组,而是只使用缓存的值。我建议使用 EnumSet,原因如下:
- 所有基本操作都是常数时间。
- 缓存重复的枚举值没有意义,Set 实现会为您处理。
但是,需要考虑的几件事是 EnumSet 中不允许使用空值(非常怀疑您想要缓存空值)。第二要注意的是 EnumSet 不是同步的。因此,如果您要进行多线程访问并修改此缓存,则必须使用 Collections.synchronizedSet 方法对其进行包装。
我有更多枚举和一些值,我想问你缓存枚举值的方法是什么:
例如:
public enum Animal {
Dog, Cat, Cow;
static Animal[] values;
static EnumSet<Animal> cachedAnimalsEnumSet;
static List<Animal> cachedAnimalsList;
static {
values = values();
cachedAnimalsEnumSet = EnumSet.allOf(Animal.class);
cachedAnimalsList = Arrays.asList(Animal.values());
}
}
哪种方法最好: 值,cachedAnimalsEnumSet 或 cachedAnimalsList ?
假设您缓存的目的是避免每次调用 Animal.values() 时都创建新数组,而是只使用缓存的值。我建议使用 EnumSet,原因如下:
- 所有基本操作都是常数时间。
- 缓存重复的枚举值没有意义,Set 实现会为您处理。
但是,需要考虑的几件事是 EnumSet 中不允许使用空值(非常怀疑您想要缓存空值)。第二要注意的是 EnumSet 不是同步的。因此,如果您要进行多线程访问并修改此缓存,则必须使用 Collections.synchronizedSet 方法对其进行包装。