Java中能否将枚举类作为另一个枚举类的字段?业务场景咨询
问题描述
我有一张存储网页下拉选择器枚举值的表enum_config,表结构及数据如下:
表结构
create table enum_config ( config_id bigint auto_increment comment 'id' primary key, table_name varchar(30) null comment 'table name', col_name varchar(50) null comment 'column name', enum_code varchar(100) null comment 'enum value', enum_name varchar(500) null comment 'enum name' ) comment 'enums table';
表数据
| config_id | table_name | col_name | enum_code | enum_name |
|---|---|---|---|---|
| 1 | hotel_info | brand_code | 1 | brand1 |
| 2 | hotel_info | brand_code | 2 | brand2 |
| 3 | hotel_info | hotel_type | 1 | Self-Operated Hotel |
| 4 | hotel_info | hotel_type | 2 | Franchise Hotel |
我希望创建枚举类作为查询参数,设计的Java枚举类如下:
@Getter public enum TableAndColumnEnum { HOTEL("hotel_info", xxx); private final String tableName; private final xxx columnEnum; TableAndColumnEnum(String tableName, xxx columnEnum) { this.tableName = tableName; this.columnEnum = columnEnum; } } @Getter public enum TableColumnEnum { HOTEL_BRAND_CODE("brand_code"), HOTEL_TYPE("hotel_type"); private final String column; TableColumnEnum(String column) { this.column = column; } }
我希望按如下方式使用columnEnum字段:
String tableName = TableAndColumnEnum.HOTEL.tableName; String columnName = TableAndColumnEnum.HOTEL.columnEnum.HOTEL_BRAND_CODE.column; String columnName = TableAndColumnEnum.HOTEL.columnEnum.HOTEL_TYPE.column;
请问Java是否支持这种写法?
解答
Java不支持你当前设计的这种写法,因为你试图让TableAndColumnEnum的columnEnum字段直接持有另一个枚举的类型并通过它访问枚举常量,但当前代码里的xxx无法直接对应TableColumnEnum的类型来实现这种链式访问逻辑。
不过可以通过调整枚举结构实现类似的效果,以下是两种可行方案:
方案1:将列枚举嵌套在表枚举内部
把对应表的列枚举定义为表枚举的内部枚举,这样就能实现你想要的链式访问:
@Getter public enum TableAndColumnEnum { HOTEL("hotel_info") { @Override public ColumnEnum getColumnEnum() { return ColumnEnum.class; } @Getter public enum ColumnEnum { HOTEL_BRAND_CODE("brand_code"), HOTEL_TYPE("hotel_type"); private final String column; ColumnEnum(String column) { this.column = column; } } }; private final String tableName; TableAndColumnEnum(String tableName) { this.tableName = tableName; } public abstract Class<? extends Enum<?>> getColumnEnum(); }
使用方式:
String tableName = TableAndColumnEnum.HOTEL.getTableName(); // 直接访问内部枚举常量 String brandCode = TableAndColumnEnum.HOTEL.ColumnEnum.HOTEL_BRAND_CODE.getColumn(); String hotelType = TableAndColumnEnum.HOTEL.ColumnEnum.HOTEL_TYPE.getColumn();
方案2:让表枚举持有列枚举的Class对象
如果不想使用内部枚举,可以让TableAndColumnEnum存储对应列枚举的Class,结合列枚举直接访问常量:
@Getter public enum TableAndColumnEnum { HOTEL("hotel_info", HotelColumnEnum.class); private final String tableName; private final Class<? extends Enum<?>> columnEnumClass; TableAndColumnEnum(String tableName, Class<? extends Enum<?>> columnEnumClass) { this.tableName = tableName; this.columnEnumClass = columnEnumClass; } } @Getter public enum HotelColumnEnum { HOTEL_BRAND_CODE("brand_code"), HOTEL_TYPE("hotel_type"); private final String column; HotelColumnEnum(String column) { this.column = column; } }
使用方式:
String tableName = TableAndColumnEnum.HOTEL.getTableName(); // 通过绑定的列枚举类访问常量 String brandCode = HotelColumnEnum.HOTEL_BRAND_CODE.getColumn();
如果需要严格绑定表与列的关联关系,方案1的内部枚举方式更贴合需求,能避免跨表的列枚举被错误使用。
内容的提问来源于stack exchange,提问作者accbear
相关产品推荐
相关产品推荐

