c# 枚举转java枚举案例

来源:互联网 发布:淘宝助理上传宝贝步骤 编辑:程序博客网 时间:2024/06/06 03:03

前言:我们项目需要从c#语言转换为java语言,下面我们需要讨论的是怎么把C#枚举转换成java枚举。
将C#语言转成java语言?你可能会说,嘿,这不是轻而易举的是么?
事实证明这不是。
c#中的枚举可以自我进行位运算,而java的枚举不可以。也许你又会说,嘿,这不也简单么?java获取到具体的枚举值再进行位运算不就可以了么?
不行!
举个栗子:
现有枚举
//C#代码

 
public enum Permission {
None(“None”0),
Eidit(“Edite”,1<<1),
Print(“Print”1<<2),
Read(“Read”,1<<3),
Copy(“Copy”1<<4),;
}
如果转成java代码就是下面这个样子
java代码
 
//引包略
//Java 代码
public enum Permission {
None(“None”0),
Eidit(“Edite”,1<<1),
Print(“Print”1<<2),
Read(“Read”,1<<3),
Copy(“Copy”1<<4),;
private String name;
private int value;
Permission(String name,int value){
this.name = name
this.value=value;
}
public String getName(){
return this.name
}
public int getValue(){
return this.value;//End
}
//根据枚举value值获取枚举
public static Permission getPermissionFromValue(int Value){
Permission[] permissions = Permission.values();
for (int i = 0; permissions.length();i++){
if(value==permissions[i]){
return permissions[i]
}
return null;
}
}
}

好了,现在我们需要做位运算,需要将Read权限跟Copy权限并起来,我们来看看c#怎么操作

 
Permission permission = Permission .Read|Permission.Copy;

这样结果permission值的二进制就变成了1100.

看看java怎么并起来怎么写

 
Permisson permission = Permission.getPermissionFromValue(Permission.Read.getValue()|Permission.Copy.getValue());

当我们运行上面的代码的时候就会发现getPermissionFromValue返回的是null。

回顾一遍上面的代码你就会发现,c#中枚举值可以自己进行位运算然后用枚举保存是多么方便了。之所以java要多写一个方法getPermissionFromValue是需要利用运算结果去找到相应的枚举才能保存。

因为在我们项目中有个比较特殊的情况,枚举最初获取到的值是int,而且最终枚举需要最终表示成int传参出去。所以总结起来无非要解决下面的问题 或者可以说找到java替代c#位运算的方法:
1.用户如果调取方法接口
2.permission&=~Permission.Copy –>如何删除枚举
3.permission |=Permission.Copy–>如果添加枚举
4.bool isInclude = (permission&Permission.Copy!=0)如何判断是否包含枚举
5.传入int找出相应的枚举集合
6.传入枚举集合找出相应的int值

我们两种解决方案

方案一:
模仿C#枚举,写一个普通类,在此类中定义一个int类型的变量来保存枚举合并起来的值,相当于是一个枚举集合,定义一系列私有static final的此类的值来表示枚举值。对应上面我们要解决的问题,我们就写出了一下Demo。
以下为java代码。

 
public class Permission{
// int值用来模拟保存枚举集合
private int permissionsValue;
//以下的值固定,用来模拟枚举值
public static final Permission None= new Permission(1<<0);
public static final Permission Copy= new Permission(1<<1);
public static final Permission Write= new Permission(1<<2);
public static final Permission Print= new Permission(1<<3);
public static final Permission Read= new Permission(1<<4);
//构造函数
private Permission(int value){
permissionsValue = value;
}
//删除枚举
public void remove(Permisson permission){
permissionsValue &=~permission;
}
//添加枚举
public void add(Permission permission){
permissionsValue|=permission;
}
// 判断是否包含枚举
public void isInclude(Permission permission){
return(permissionsValue&permission.permissionValue!=0)
}
//传入int找出相应的枚举集合
public Permission getPermission(int value){
return new Permission(value);
}
//传入枚举集合找出相应的int值
public int getPermisssionValue(Permission permission){
return permission.permissionValue;
}
}

我们来根据需要解决的问题编写Demo

 
public class Demo{
private Permission m_permission;
//get set 方法略
public void operatePermissions(Permisison permission){
System.out.println(permission);
}
//main方法测试
public static void main (String [] args){
Demo demo = new Demo();
//1.用户如何调取方法接口
Permission permission = new Permission();
permission.add(Permission.Copy);
permission.add(Permission.Write);
demo.operatePermissions(permission);
//2.permission&=~Permission.Copy –>如何删除枚举
m_permission.remove(Permission.Copy);
//3.permission |=Permission.Copy–>如果添加枚举
m_permission.add(Permission.Copy);
//4.bool isInclude = (permission&Permission.Copy!=0) –>如何判断是否包含枚举
m_permission.isInclude(Permission.Copy);
//5.传入int找出相应的枚举集合
Permission permission = Permission.getPermissions(3);
//6.传入枚举集合找出相应的int值
int value = Permission.getPermisssionValue(m_permission);
}
}
}

方案二:
我们可以用枚举几个EnumSet来把枚举装入表示集合,需要计算的时候取出来计算,计算完了在写方法找出对应的枚举赋值回去。当然,需要重申一遍我们需要解决的是以下的六个问题。
1.用户如果调取方法接口
2.permission&=~Permission.Copy –>如何删除枚举
3.permission |=Permission.Copy–>如果添加枚举
4.bool isInclude = (permission&Permission.Copy!=0)如何判断是否包含枚举
5.传入int找出相应的枚举集合
6.传入枚举集合找出相应的int值

 
pubic enum Permission{
None(“None”0),
Eidit(“Edite”,1<<1),
Print(“Print”1<<2),
Read(“Read”,1<<3),
Copy(“Copy”1<<4),;
private String name;
private int value;
Permission(String name,int value){
this.name = name
this.value=value;
}
public String getName(){
return this.name
}
public int getValue(){
return this.value;
}
//传入枚举集合找出相应的int值
public int getPermissionValue(EnumSet permissions){
int result = 0;
for(Permission ps : permissions){
result | =ps.getValue();
}
return result;
}
//传入枚举集合找出相应的int值
public EnumSet getPermissionValue(int value){
EnumSet result = EnumSet.noneOf(Permission.class);
Permission[] ps = Permission.values();
for(int i=0;ips.length;i++){
if(value & ps[i].getValue() !=0)
result.add(ps[i])
}
}
}

同样编写Demo测试类

 
public calss Demo(){
private EnumSet m_permission;
//set get 方法略
public void operatePermissions(EnumSet permission){
System.out.println(permission);
}
public static void main (String [] args){
//1.用户如何调取方法接口
EnumSet permissions = EnumSet.of(Permission.Copy,Permission.Write);
demo.operatePermissions(permissions);
//2.permission&=~Permission.Copy –>如何删除枚举
m_permission.remove(Permission.Copy);
//3.permission |=Permission.Copy–>如果添加枚举
m_permission.add(Permission.Copy);
//4.bool isInclude = (permission&Permission.Copy!=0) –>如何判断是否包含枚举
bool isInclude =m_permission.contains(Permission.Copy);
//5.传入int找出相应的枚举集合
EnumSet permission = Permission.getPermissions(3);
//6.传入枚举集合找出相应的int值
int value = Permission.getPermisssionValue(m_permission);
}
}

对比以上两个DEMO我们发现,
方法二具有比方法一两个优点:
1. 暴露的接口更容易理解
2. 在c#原有的类上添加的方法更少,例如 add remove contains 等方法 EnumSet已经实现不需要我们重新写。

所以最终我们选择了第二个方案

原创粉丝点击