谈谈枚举的新用法——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 ...
随机推荐
- Hbase的伪分布式安装
Hbase安装模式介绍 单机模式 1> Hbase不使用HDFS,仅使用本地文件系统 2> ZooKeeper与Hbase运行在同一个JVM中 分布式模式– 伪分布式模式1> 所有进 ...
- 三星Note 7停产,原来是吃了流程的亏
三星Note 7发售两个月即成为全球噩梦,从首炸到传言停产仅仅47天.所谓"屋漏偏逢连天雨",相比华为.小米等品牌对其全球市场的挤压.侵蚀,Galaxy Note 7爆炸事件这场连 ...
- swift开发新项目总结
新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案 1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编 考虑到新项目 ...
- HotApp小程序服务范围资质查询器
微信小程序提交审核需要选择资质服务范围,如果服务范围不对,审核会不通过, 开发小程序之前,最好先查询所开发小程序的资质范围,否则无法通过微信审核. 小程序的资质范围查询地址,数据同步微信官方 ht ...
- MySQL+Amoeba实现数据库主从复制和读写分离
MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...
- git &github 快速入门
本节内容 github介绍 安装 仓库创建& 提交代码 代码回滚 工作区和暂存区 撤销修改 删除操作 远程仓库 分支管理 多人协作 github使用 忽略特殊文件.gitignore 1.gi ...
- Linux:将rhel yum 切换到centos yum
Red Hat Enterprise Linux Server(RHEL) yum安装软件时This system is not registered with RHN. RHN support wi ...
- Ognl表达式基本原理和使用方法
Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...
- Jquery EasyUI 开发实录
有好几年没有用过EasyUI了,最近在外包做的一个项目中新增功能时,又用到了,本以为和按照以前那样用就可以了,可当我真正用的时候,发现许多地方不一样了,就连官网的文档都更新了,最突出的就是不知道什么时 ...
- 将css和js缓存到localStorage缓存,提高网页响应速度
适用于小站点,这很极致,很快速~~ /** * Created by SevenNight on 2016/9/21 0021. * 插件功能:使用localStorage缓存js和css文件,减少h ...