Enum类型

本文介绍了一种用于定义缓存有效期的枚举类实现方式。通过私有构造方法及枚举成员,确保了每个缓存类型的有效时间精确可控。同时,文章解释了如何在Java中正确使用枚举类型,并提供了实例说明。
	public enum CacheTime {
		DEFAULT_WIFI(60), DEFAULT_MOBILE(6 * 60), NO_EXPIRED_ALL(365 * 24 * 60);
		public final long value;
		public static final int MINUE = 1000 * 60;

		private CacheTime(long s) {
			this.value = s * MINUE;
		}
	}

引用时:

CacheTime.DEFAULT_WIFI.value;

关于枚举类型:每一个枚举类型隐式继承自java.lang.Enum,由于Java不支持多重继承,所以枚举类型不能再继承其它类。

说说上面的代码吧。定义了一个缓存有效时间的枚举类。构造函数是私有的。

DEFAULT_WIFI等都是枚举类型,后面的参数是干什么用的?

构造用的,调用私有的CacheTime(long s)构造方法,初始化。所以,每一个枚举类型在其它地方使用的时候,可以直接用CacheTime.DEFAULT_WIFT.value.

这些enum type都包含了变量value,MINUE,而且都继承了Enum类,可以调用Enum类中的公有方法。


关于枚举类的构造方法:必须是私有(private)或者包级私有(default)。不可以手动调用其构造方法。


Oracle的tutorial:

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

<think>我们正在处理关于MySQL中ENUM枚举类型的查询问题。根据用户提供的引用内容,我们可以总结出以下几点关键信息: 1. ENUM类型在创建时需要显式指定枚举值列表(引用[1][2])。 2. 插入数据时,如果插入的值枚举列表中,在严格模式下会报错(Data truncated),在非严格模式下会插入空字符串(引用[1][4])。 3. ENUM类型在存储时实际上是以整数索引的形式存储的(引用[2][3])。 4. 查询时,ENUM类型区分大小写(引用[2])。 5. 使用整数索引查询时,只能使用整数(如1,2,...),能使用字符串形式的索引(如'1')(引用[2])。 6. 插入NULL值的情况:如果字段定义为非NULL,则插入NULL会失败(引用[4])。 用户的问题是关于查询的,因此我们需要重点解释如何正确查询ENUM类型的字段。 根据引用[2]中的示例: - 正常查询:`select * from test_gender where gender='M'` (正确) - 小写查询:`select * from test_gender where gender='m'` (也能查询出大写数据,因为区分大小写) - 整数索引查询:`select * from test_gender where gender=1` (可以查询出结果,这里的1代表第一个枚举值,即'M') - 字符串索引查询:`select * from test_gender where gender='1'` (查询结果为空,因为字符串'1'被认为是索引,而是试图匹配枚举值,而枚举值中没有'1') 因此,在查询ENUM类型字段时,我们需要注意: 1. 可以直接使用枚举值(字符串)进行查询,且区分大小写。 2. 可以使用整数索引进行查询,但必须用整数,能用字符串形式的整数。 3. 避免使用枚举列表中的值进行查询,否则可能返回空结果。 另外,引用[4]提到,如果插入了枚举列表中的值,在非严格模式下,该字段会被存储为''(空字符串),并且其内部索引值为0。因此,查询时如果使用`where 枚举字段=0`,可以查询出这些错误插入的记录(因为索引0对应空字符串),而使用`where 枚举字段=''`也可以查询出这些记录(因为存储的值是空字符串)。 现在,我们根据以上信息来回答用户的问题。</think>### MySQL ENUM枚举类型的查询问题分析 #### 1. **ENUM类型的基本查询规则** - **字符串查询区分大小写** 查询时ENUM字段区分大小写,例如`WHERE gender='m'`和`WHERE gender='M'`效果相同[^2]。 - **索引查询仅支持整数** 可通过枚举值的索引位置查询(索引从1开始),但**必须使用整数**: ```sql SELECT * FROM table WHERE enum_column = 1; -- 有效,返回第一个枚举值 SELECT * FROM table WHERE enum_column = '1'; -- 无效,返回空结果[^2] ``` #### 2. **特殊值查询场景** - **空字符串值查询** 当插入非法值时(非严格模式),字段会存储为空字符串: ```sql SELECT * FROM table WHERE enum_column = ''; -- 查询所有非法值记录 ``` - **索引0查询** 非法值在内部存储为索引0: ```sql SELECT * FROM table WHERE enum_column = 0; -- 等价于空字符串查询[^4] ``` #### 3. **查询性能注意事项** - **索引使用限制** ENUM类型虽以整数存储,但字符串查询仍可能触发全表扫描(如`WHERE enum_column='value'`),建议对高频查询字段建立索引[^3]。 - **类型转换风险** 混合使用字符串和整数查询可能导致隐式类型转换,影响性能: ```sql SELECT * FROM table WHERE enum_column = '2'; -- 字符串条件,索引失效 SELECT * FROM table WHERE enum_column = 2; -- 整数条件,可用索引 ``` #### 4. **设计层面的查询影响** - **枚举值修改问题** 修改ENUM定义(如`ALTER TABLE ... MODIFY COLUMN`)可能导致历史数据查询异常: ```sql -- 原定义:enum('a','b') ALTER TABLE table MODIFY enum_column enum('x','y','z'); -- 历史数据'b'在新枚举存在,查询时返回空字符串[^1][^4] ``` - **跨数据库兼容性** ENUM类型在其他数据库(如PostgreSQL)中被支持,迁移时需重写所有相关查询语句[^3]。 > **关键总结**:ENUM查询需严格区分字符串和整数查询方式,警惕非法值导致的空字符串结果,修改枚举定义可能破坏现有查询逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值