谈谈枚举的新用法——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 ...
随机推荐
- 0-1背包问题蛮力法求解(java版本)
sloves: package BackPack; public class Solves { public int[] DecimaltoBinary(int n,int m) { int ...
- eclipse 快捷键大全
注:因eclipse版本.电脑配置等原因 有些快捷键可能导致不可用(遇到些许问题可在下方评论) [Ct rl+T] 搜索当前接口的实现类 1. [ALT +/] 此快捷键为用户编辑的好帮手,能为 ...
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- LINQ to SQL Where条件
1. 适用场景 实现条件的过滤和查询等功能. 2. 说明 跟SQL语句中的where作用相似,都起到了范围的限定即过滤的作用,而判断条件是紧跟后面的条件子句.where主要分为三种形式:简单形式.条件 ...
- 游走 bzoj 3143
游走(2s 128MB)walk [问题描述] [输入格式] [输出格式] [样例输入] 3 3 2 3 1 2 1 3 [样例输出] 3.333 [样例说明] 题解: 主要算法:贪心:高斯消元: 题 ...
- Form 表单提交参数
今天因为要额外提交参数数组性的参数给form传到后台而苦恼了半天,结果发现,只需要在form表单对应的字段html空间中定义name = 后台参数名 的属性就ok了. 后台本来是只有模型参数的,但是后 ...
- linux压缩和解压缩命令大全
.tar 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName ------------------------------------- ...
- 写个Fragment方便的抽象基类 BaseFragment
package com.zb.zhihuianyang.base; import android.app.Activity; import android.os.Bundle; import andr ...
- 整理Ajax的点点滴滴
最近看了下<Javascript高级程序设计>(第三版)关于Ajax部分,做了这篇笔记. 一.常规用法 第一步,创建XHR对象var xhr = new XMLHttpRequest(); ...
- Vue.js——vue-resource全攻略
概述 上一篇我们介绍了如何将$.ajax和Vue.js结合在一起使用,并实现了一个简单的跨域CURD示例.Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的D ...