【Effective Java】9、使用EnumMap代替序数索引

package cn.xf.cp.ch02.item33;

import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set; import org.junit.Test; /**
*
*功能:序数索引
*时间:下午4:24:48
*文件:HerbOld.java
*@author Administrator
*
*/
public class HerbOld
{
public enum Type
{
ANNUAL, PERENNIAL, BIENNIAL
} private String name;
private Type type; /**
* 包区权限
* @param name
* @param type
*/
HerbOld(String name, Type type)
{
this.name = name;
this.type = type;
} @Override
public String toString()
{
return name;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public Type getType()
{
return type;
} public void setType(Type type)
{
this.type = type;
} }

分别使用序数和enummap的结果:

package cn.xf.cp.ch02.item33;

import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set; import org.junit.Test; import cn.xf.cp.ch02.item33.HerbOld.Type; public class HerbTest
{
@Test
public void tes1t()
{
HerbOld garden[] =
{ new HerbOld("Basil", Type.ANNUAL), new HerbOld("Carroway", Type.BIENNIAL), new HerbOld("Dill", Type.ANNUAL),
new HerbOld("Lavendar", Type.PERENNIAL), new HerbOld("Parsley", Type.BIENNIAL),
new HerbOld("Rosemary", Type.PERENNIAL) }; // 使用map,键存放类型,值存放集合,enumMap是map中专门用于枚举键的
Map<HerbOld.Type, Set<HerbOld>> herbsByType = new EnumMap<HerbOld.Type, Set<HerbOld>>(HerbOld.Type.class); //创建全部类型的集合
for (HerbOld.Type t : HerbOld.Type.values())
herbsByType.put(t, new HashSet<HerbOld>()); for (HerbOld h : garden)
herbsByType.get(h.getType()).add(h);
System.out.println(herbsByType);
}
  
  
  
@Test
public void test1()
{
HerbOld garden[] =
{ new HerbOld("Basil", Type.ANNUAL), new HerbOld("Carroway", Type.BIENNIAL), new HerbOld("Dill", Type.ANNUAL),
new HerbOld("Lavendar", Type.PERENNIAL), new HerbOld("Parsley", Type.BIENNIAL),
new HerbOld("Rosemary", Type.PERENNIAL) }; // 在使用这个类的集合的时候,我们有三种这个类型,所以要分开集合,三个集合表示ANNUAL, PERENNIAL,
// BIENNIAL三种type
// 创建相对应数量的数组
Set<HerbOld> herbsByType[] = (Set<HerbOld>[]) new Set[HerbOld.Type.values().length]; // 对应的set类型创建对应的set集合
for (int i = 0; i < herbsByType.length; ++i)
{
herbsByType[i] = new HashSet<HerbOld>();
} // 根据枚举类型的位置来判定相应类型集合的位置,并把数据添加进去
for (HerbOld ho : garden)
{
// ordinal,这个返回对应枚举类型在声明的时候的位置
herbsByType[ho.getType().ordinal()].add(ho);
} // 遍历
for (int i = 0; i < herbsByType.length; ++i)
{
// 这里这个是可以运行的
/**
* 但是这里要注意: 当你访问一个按照枚举的序数进行索引的时候,明确知道int类型代表枚举的那个类型你就得好好想想了,
* 如何正确使用int对应的集合类型是对应那个
* 而int并不能提供枚举类型的安全。如果你使用了错误的值,那么程序就会悄悄的完成意料之外的工作
*/
System.out.printf("%s: %s%n", HerbOld.Type.values()[i], herbsByType[i]);
}
}
}

序数:

test1()

【Effective Java】9、使用EnumMap代替序数索引

使用enummap,tes1t

【Effective Java】9、使用EnumMap代替序数索引

上一篇:通知url必须为直接可访问的url,不能携带参数 异步接收微信支付结果通知的回调地址 不能携带参数。 回调地址后是否可以加自定义参数 同步回调地址 异步回调地址 return_url和notify_url的区别


下一篇:hadoop工作流引擎之azkaban