谈谈枚举的新用法——java
问题的由来
前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!
事情是这样的,做过游戏的都知道,buff,需要分类型,且包含是否需要切换场景删除,下线删除,死亡删除等信息,好吧我就把这个做到一起了用一个字段标识!
问题就出来了;
/**
*
* <br>
* author 失足程序员<br>
* mail 492794628@qq.com<br>
* phone 13882122019<br>
*/
public class EnumTest {
private static final Logger log = Logger.getLogger(EnumTest.class);
public enum BuffType {
Null(0, "空buff"),
DieDel(62, "死亡删除"),
ChangeMapDel(63, "切换场景删除");
int index;
long value;
String msgString;
BuffType(int index, String msg) {
this.index = index;
this.value = 1L << index;
msgString = msg;
}
public int getIndex() {
return index;
}
public String getMsgString() {
return msgString;
}
public static BuffType getBuffType(int index) {
BuffType[] values = BuffType.values();
for (BuffType buffType : values) {
if (buffType.getIndex() == index) {
return buffType;
}
}
return null;
}
/**
* 是否包含一个状态
*
* @param tvalue
* @return
*/
public boolean hasFlag(BuffType tvalue) {
return (value & tvalue.value) != 0;
}
/**
* 增加一个状态
*
* @param buffType
*/
public void addStatus(BuffType buffType) {
value = value | buffType.value;
}
/**
* 移除一个状态
*
* @param buffType
*/
public void removeStatus(BuffType buffType) {
value = value & (~buffType.value);
}
}
public static void main(String[] args) {
BuffType buffType = BuffType.Null;
buffType.addStatus(BuffType.DieDel);
}
}
晃眼一看好像没什么问题对吧??当然你已经有过这样一次上当经历的宁说!
解密
当时情况是这样的,我修改完buff功能模块以后我就让策划测试代码功能,我继续改其他功能模块,然后策划告诉我不对,我准备调试的时候可是代码已经不是源代码了,需要重新启动程序才能调试,好吧我重启完成,测试告诉我对了,好吧我又继续该功能模块,过了半小时策划再次告诉我不对了,我又一次的需要重启才能调试,好吧就这样陷入死循环,一直到晚上吃饭我。、我直接说改了一下午代码走出去活动活动吃饭回来继续看,回来后我就不再修改代码,就等测试这个功能;这下发现了情况,
使用流程
public static void main(String[] args) {
BuffType buffType = BuffType.Null;
buffType.addStatus(BuffType.DieDel);
if (buffType.hasFlag(BuffType.DieDel)) {
System.out.println("下线需要删除buff");
}
buffType = BuffType.Null;
if (buffType.hasFlag(BuffType.DieDel)) {
System.out.println("下线需要删除buff");
}
}
接下来看看输出结果:

问题来了为什么我明明是新来的一个赋值对象为啥还是包含状态???
我想了一下,突然回过神来,枚举是静态常量啊,我的任何修改都会导致所有引用全部修改,
好吧,既然找到问题了就来修改吧。
再次阐述一下,我这里需要枚举的原因,一个是为了策划配置方便,他们只要1,2,3这种形式
而我需要位移运算,保存状态值,并且还需要枚举类型的文字描述,提供给运维,运营和策划看的。
修改后如何使用
因为我个人喜欢比较喜欢枚举,加上能定义枚举的方便些;
接下来就修改,修改,
/**
*
* <br>
* author 失足程序员<br>
* mail 492794628@qq.com<br>
* phone 13882122019<br>
*/
public class EnumTest {
private static final Logger log = Logger.getLogger(EnumTest.class);
private long tVlaue = 0;
public enum BuffType {
DieDel(62, "死亡删除"),
ChangeMapDel(63, "切换场景删除");
int index;
long value;
String msgString;
BuffType(int index, String msg) {
this.index = index;
this.value = 1L << index;
msgString = msg;
}
public int getIndex() {
return index;
}
public String getMsgString() {
return msgString;
}
}
/**
* 根据策划配置还原枚举
*
* @param index
* @return
*/
public static BuffType getBuffType(int index) {
BuffType[] values = BuffType.values();
for (BuffType buffType : values) {
if (buffType.getIndex() == index) {
return buffType;
}
}
return null;
}
/**
* 是否包含一个状态
*
* @param tvalue
* @return
*/
public boolean hasFlag(BuffType tvalue) {
return (tVlaue & tvalue.value) != 0;
}
/**
* 增加一个状态
*
* @param buffType
*/
public void addStatus(BuffType buffType) {
tVlaue = tVlaue | buffType.value;
}
/**
* 移除一个状态
*
* @param buffType
*/
public void removeStatus(BuffType buffType) {
tVlaue = tVlaue & (~buffType.value);
}
public static void main(String[] args) {
EnumTest buffType = new EnumTest();
buffType.addStatus(BuffType.DieDel);
if (buffType.hasFlag(BuffType.DieDel)) {
System.out.println("包含:" + BuffType.DieDel.getMsgString());
} else {
System.out.println("不包含:" + BuffType.DieDel.getMsgString());
}
buffType = new EnumTest();
if (buffType.hasFlag(BuffType.DieDel)) {
System.out.println("包含:" + BuffType.DieDel.getMsgString());
} else {
System.out.println("不包含:" + BuffType.DieDel.getMsgString());
}
}
}
结果:
我知道这篇文字对大神没什么用,希望对新手有所帮助,同时也记录一次犯二的我!
谈谈枚举的新用法——java的更多相关文章
- K:java中枚举的常见用法
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...
- Java枚举类型的用法
JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 1.用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fia ...
- Java中枚举的常见用法
在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...
- Java SE 枚举的基本用法
出于对自己基础的稳打,期末考试后依旧对SE部分进行复习 枚举的基本用法 public enum Season { SPRING,SUMMER,AUTUMN,WINTER } public class ...
- C++11之for循环的新用法《转》
相关资料:https://legacy.gitbook.com/book/changkun/cpp1x-tutorial/details C++11之for循环的新用法 C++使用如下方法遍历一个容器 ...
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...
- 详解Vue的slot新用法
摘要: 理解Vue插槽. 作者:前端小智 原文:vue 2.6 中 slot 的新用法 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 最近发布不久的Vue ...
- JOptionPane用法--java
JOptionPane用法--java JOptionPane的简单应用: 1.首先引入包: import javax.swing.JOptionPane; 2.添加如下代码: Object[] op ...
- C++虚函数的新用法
1.今天在segmentfault上看到了一个C++虚函数的新用法,先上代码 #include <iostream> using namespace std; class B { publ ...
随机推荐
- java基础_集合List与Set接口
List接口继承了Collection的方法 当然也有自己特有的方法向指定位置添加元素 add(索引,添加的元素); 移除指定索引的元素 remove(索引) 修改指定索引的元素 set ...
- Supermap iCloudManager -负载均衡
Supermap icm负载均衡理解: 应用场景:地图出图 子节点1和子节点2中的服务保持一致,一般情况下设置的是匿名用户通过nginx访问服务信息,所以不需要登录. 1.通过nginx分发请求,(轮 ...
- Android Studio —— 创建Menu菜单项
大多数android程序的右上角都会设置一个菜单按钮比如微信的界面右上角的加号. 这个需要在layout同级目录下新建文件夹命名为menu,再右击新建的menu新建xml文件:
- 敏捷转型历程 - Sprint3 Planning
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...
- SSIS 包部署 Package Store 后,在 IS 中可以执行,AGENT 执行却报错
可以执行 SSIS Package ,证明用 SSIS Package 的账户是可以执行成功的.SQL Server Agent 默认指定账号是 Network Service. 那么可以尝试一下将 ...
- 解决 Error: getaddrinfo EADDRINFO 错误
安装npm失败,提示Error: getaddrinfo EADDRINFO,原因在于虚拟机未连接互联网,悲剧.
- 页面元素坐标和偏移(clientX/pageX/screenX/layerX/offsetWidth/scrollWidth/clientWidth等)相关整理
鼠标事件都是在特定位置发生的,我们可以通过event事件对象的各种属性来获得事件发生的坐标位置,有相对于视口的,有相对于整个文档的,同样页面元素的位置也有相对视口的,也有滚动后的,这些都比较容易混淆, ...
- 如何开发一个简单的HTML5 Canvas 小游戏
原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...
- 在ASP.NET MVC5中实现具有服务器端过滤、排序和分页的GridView
背景 在前一篇文章<[初学者指南]在ASP.NET MVC 5中创建GridView>中,我们学习了如何在 ASP.NET MVC 中实现 GridView,类似于 ASP.NET web ...
- python装饰器
今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...