上次提到了把数据库的INT字段映射到Java里的Enum,但这样的字段只表示保存一个值。以前用C时经常会写这样的代码:
const int TYPE_1 = 1;
const int TYPE_2 = 2;
const int TYPE_3 = 4;
int type = TYPE_1 | TYPE_3;
if (type & (TYPE_1 | TYPE_3)) {
...
}
这样我可以在type变量里保存多个boolean类型的option。在Java里面类似的功能可以通过EnumSet实现,但是我还是希望在数据库里只用一个INT字段就可以保存整个EnumSet,自然还是通过自定义一个UserType来实现。
以上一篇文章里的IntegerValuedEnumType基础,再增加两个方法,encode用来把EnumSet转换为Integer,decode用来把Integer解码为EnumSet。其他只需要稍加修改即可。
/*
* Encode the EnumSet into an integer based on bit on/off
*/
private int encode(EnumSet<T> set) {
int ret = 0;
for (T val : set) {
ret |= 1 << val.getCode();
}
return ret;
}
/*
* Decode the integer back to a EnumSet based on bit on/off
*/
private EnumSet<T> decode(int code) {
Map<Integer, T> codeMap = new HashMap<Integer, T>();
for (T val : EnumSet.allOf(enumClass)) {
codeMap.put(val.getCode(), val);
}
EnumSet<T> result = EnumSet.noneOf(enumClass);
while (code != 0) {
int ordinal = Integer.numberOfTrailingZeros(code);
code ^= Integer.lowestOneBit(code);
result.add(codeMap.get(ordinal));
}
return result;
}
相关文章:
用Hibernate映射INT字段到枚举类型:
http://voidtech.iteye.com/blog/641347
分享到:
相关推荐
在EnumSet抽象类中,还定义了一个抽象方法addAll,该方法用于将所有枚举类型元素添加到EnumSet对象中。 EnumSet抽象类的子类包括RegularEnumSet和JumboEnumSet。RegularEnumSet是EnumSet抽象类的默认实现,而...
EnumSet 是 Java 中用于存储枚举类型元素的集合类。它是 AbstractSet 的子类,并专门为枚举类型设计,提供了高效的实现。 下面是关于 EnumSet 的一些重要信息: 存储枚举元素:EnumSet 只能存储同一个枚举类型的...
在Java编程中,有时我们需要表示一组特定状态或...在大多数情况下,我们应优先考虑使用`EnumSet`,除非在特定场景下需要位域来构建通信协议字段。在实际开发中,理解并善用`EnumSet`能够提升代码质量,降低维护成本。
这篇博客将深入探讨Java枚举的特性和使用方法,包括`EnumSet`和`EnumMap`这两个与枚举相关的数据结构。 首先,枚举定义的基本语法是`public enum EnumName {constant1, constant2, ...}`。每个枚举常量都是`...
目录介绍特征安装用法设置一个MappedValueRepresentable枚举使用MappedValueCollectionRepresented 使用MappedEnum类型的可编码枚举在ESet中使用OptionSet中的EnumSet 将EnumSet转换为Enum数组使用...
本文总结了Effective Java 中关于枚举与注解的知识点,涵盖了枚举类型的优点、使用指南、避免使用 int 常量、使用 EnumSet 和 EnumMap 等。 枚举类型的优点 枚举类型提供了编译时类型安全、自动命名空间隔离、可以...
在Java编程中,当我们需要处理特定枚举类型(Enum)作为键(Key)的映射关系时,EnumMap和EnumSet成为两种非常实用的工具类。它们是Java集合框架中专门为枚举类型设计的高效容器,提供了比普通HashMap和HashSet更好...
首先以事实说话,存在这样一个EnumSet,它有50个枚举值T0~T49,将50个值插入到容器(HashSet、EnumSet)中,为一个操作,将50个枚举值移出做为第二个操作。把第一个和第二个操作执行的总时间设定为一个周期,拿...
##### 4.2 EnumSet 使用示例 `EnumSet` 是一个专为枚举类型设计的集合类,用于存储枚举类型的元素。它提供了一些特殊的方法,使得操作枚举元素更加高效: ```java public static void testEnumSet() { EnumSet...
Effective Java 3 学习记录 本学习记录主要介绍了 Effective Java 3 中的静态工厂方法和 ...Builder 类中有必填字段和选填字段,使用者可以根据需要选择性地设置字段值。最后,使用 build() 方法来构建 Fruit 对象。
`EnumSet`是一个高效的集合,用于存储枚举类型,而`EnumMap`则是一个键为枚举类型的高效映射表: ```java EnumSet<WeekDay> weekendDays = EnumSet.of(WeekDay.SATURDAY, WeekDay.SUNDAY); for (WeekDay day : ...
`EnumMap`是一个映射,其中的键是枚举类型,而`EnumSet`则是一个高效、不可变的集合,只包含枚举类型中的元素。 二、反射机制 反射机制允许在运行时检查类的信息,包括类的结构、字段、方法等,并动态创建和访问...
2. **用普通类模拟枚举**: 在早期的Java版本中,没有枚举类型,开发者通常会使用静态常量来模拟枚举的功能。例如: ```java public class Color { public static final Color RED = new Color(); public ...
enumset一个用于定义可在紧凑位集中使用的枚举的库。 它支持最多128个变量的枚举,并具有在枚举中使用这些集合的宏。用于定义可在紧凑位集中使用的枚举的库。 它支持最多128个变量的枚举,并具有一个宏以在常量中...
当这些类的实例添加到HashSet中时,ClassA的实例由于哈希码不同而存储在不同位置,ClassB的实例由于`equals()`返回不同的对象地址而形成链表,而ClassC的实例则被视为同一对象。 **LinkedHashSet类** 是另一种Set...
- Java 8引入的新特性,简化了函数式编程,如 `(int a, int b) -> a + b` 表示一个加法函数。 8. **Stream API**: - 提供了一种新的处理数据的方式,支持并行和顺序流操作,例如过滤、映射、归约等。 9. **日期...
实验报告主要涵盖了Java编程中的高级主题,特别是关于集合框架、映射和枚举类型的应用。以下是对这些知识点的详细说明: 1. **Java集合框架**: - **ArrayList**: 是基于数组实现的列表,提供了随机访问元素的能力...
6. **避免使用ENUM或者禁止使用ENUMSET类型字段** - **解释**:ENUM类型虽然可以简化数据输入,但其灵活性较低,不建议在业务场景中使用。 7. **尽可能把所有列定义为NOT NULL** - **解释**:NULL值可能会导致...
例如,我们可以使用 EnumMap 来保存枚举类型的映射关系: ```java EnumMap, String> map = new EnumMap(Light.class); map.put(Light.RED, "红灯"); map.put(Light.GREEN, "绿灯"); map.put(Light.YELLOW, "黄灯"); ...
import java.util.EnumSet; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; import rescuecore2.Constants; import rescuecore2.config.Config; import ...