赞
踩
未使用枚举类代码前,想要把什么东西都写死在代码里
- //初始化装载list的map,key为类别名称,value是对应的list
- HashMap<String, List<ArcAdmLccInfoDTO>> listMap = new HashMap<>(4);
- //数据库查出的未分类的全部数据
- List<TestObject> queryList = xxx.findAllWithCategoryCode(Object);
- //初始化4个装载对应对象的list
- ArrayList<TestObject> apple = new ArrayList<>();
- ArrayList<TestObject> waterMelon = new ArrayList<>();
- ArrayList<TestObject> grape = new ArrayList<>();
- ArrayList<TestObject> hamiMelon = new ArrayList<>();
- //对全部对象进行遍历筛选
- for (TestObject to : queryList) {
- switch (to.getCategoryCode()) {
- case "a-1":
- apple.add(to);
- break;
- case "w-2":
- waterMelon.add(to);
- break;
- case "g-3":
- grape.add(to);
- break;
- case "h-4":
- hamiMelon.add(to);
- break;
- default:
- break;
- }
- }
- listMap.put("apple", apple);
- listMap.put("waterMelon", waterMelon);
- listMap.put("grape", grape);
- listMap.put("hamiMelon", hamiMelon);
- return listMap;
后面整理了一下,归类后的枚举类代码如下:
- public enum TestObejctEnums {
-
- 苹果大厦("apple","a-1"),
- 西瓜公寓("water-melon","w-2"),
- 葡萄居所("grape","g-3"),
- 哈密瓜楼("hami-melon","h-4"),
- ;
-
- /**
- * categoryCode 是数据库中标识的特殊字段代码
- * specialKey 是用来作为list的key值使用
- */
- private final String categoryCode;
- private final String specialKey;
-
-
- LccInfoEnums(String specialKey ,String categoryCode) {
- this.specialKey = specialKey;
- this.categoryCode = categoryCode;
- }
-
- public String getSpecialKey() {
- return specialKey;
- }
-
- public String getCategoryCode() {
- return categoryCode;
- }
-
- }
然后结合了switch case后理想效果应当如下
- //对全部对象进行遍历筛选
- for (TestObject to : queryList) {
- //这里面进行改动,case判断分支里用枚举值
- switch (to.getCategoryCode()) {
- case TestObejctEnums.苹果大厦.getCategoryCode():
- apple.add(to);
- break;
- case TestObejctEnums.西瓜公寓.getCategoryCode():
- waterMelon.add(to);
- break;
- case TestObejctEnums.葡萄居所.getCategoryCode():
- grape.add(to);
- break;
- case TestObejctEnums.哈密瓜楼.getCategoryCode():
- hamiMelon.add(to);
- break;
- default:
- break;
- }
- }
但是出现了如下问题:
在case分支判断那里需要声明常量(需要在编译时被指定/避免二义性,balabala,这个地方为什么不能使用枚举类型获取值,个人感觉和JVM加载顺序有关,然后查了查,有说法是因为需要在编译时进行类型检查,编译的时候就应该指定,运行时候知道是什么值),这样的话,就需要对枚举类进行改造,才能在switch case中使用枚举类进行分支判断。但是该种改造还是存在一定的问题,并不能达到理想中的效果。
参照网络上的方法进行改造之后,加入一个比对的方法
-
- public enum TestObejctEnums {
-
- 苹果大厦("apple","a-1"),
- 西瓜公寓("water-melon","w-2"),
- 葡萄居所("grape","g-3"),
- 哈密瓜楼("hami-melon","h-4"),
- ;
-
- /**
- * categoryCode 是数据库中标识的特殊字段代码
- * specialKey 是用来作为list的key值使用
- */
- private final String categoryCode;
- private final String specialKey;
-
-
- LccInfoEnums(String specialKey ,String categoryCode) {
- this.specialKey = specialKey;
- this.categoryCode = categoryCode;
- }
-
- public String getSpecialKey() {
- return specialKey;
- }
-
- public String getCategoryCode() {
- return categoryCode;
- }
-
- //添加一个代码的匹配方法,对全部枚举值进行遍历,与传入的值进行比对,返回匹配的值
- public static TestObejctEnums matchCode(String categoryCode) {
- for (TestObejctEnums testObejctEnums : TestObejctEnums.values()) {
- //在这里可以根据需求更改拓展,我这里需要的是将枚举值里才存储的特殊代码段与数据库查出数据进行比对
- if (testObejctEnums.getCategoryCode().equals(categoryCode)) {
- return testObejctEnums;
- }
- }
- //根据需求变更
- return null;
- }
-
-
- }
改造后的根据枚举值比对的switch case方法:
- switch(TestObjectEnums.matchCode(testObejct.getCategoryCode())){
- case 苹果大厦:
- //把对象加入apple队列
- break;
- case 西瓜公寓:
- //把对象加入waterMelon队列
- break;
- case 葡萄居所:
- //把对象加入grape队列
- break;
- case 哈密瓜楼:
- //把对象加入hamiMelon队列
- break;
- default:
- break;
- }
- listMap.put(TestObjectEnums.苹果大厦.getSpecialKey(),苹果队列);
- // ....以此类推
- return listMap;
上面虽然是这样去分析,但是结合实际场景来思考的话,我个人总结的几点如下:
1. 占用空间上,switch case需要去生成一个跳表,那么其占用空间是比简单的if else if占用的空间多一点,是以空间换时间的思想。
2. 在分支比较多的时候,switch case是比if else if更易于拓展,且具有更好的阅读体验
3. 但是在常量分布范围很大,但是需要筛选的数据量并不大时,switch case此时占用过多的空间,对比if else if毫无疑问失去了优势。
4. switch case对于case分支,是需要以常量来做判断的,在这里if else if是可以判断一个范围,在一些场景使用更灵活。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。