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()
使用enummap,tes1t
【Effective Java】9、使用EnumMap代替序数索引的更多相关文章
-
Effective Java 第三版——37. 使用EnumMap替代序数索引
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
-
用EnumMap代替序数索引
用EnumMap代替序数索引 有时候,会见到利用ordinal方法来索引数组的代码.例如下面这个简化的类,表示一种烹饪用的香草: public class Herb { public enum T ...
-
使用 ENUMMAP 替代序数索引
import java.util.Arrays; import java.util.EnumMap; import java.util.HashSet; import java.util.Map; i ...
-
第33条:用EnumMap代替序数索引
有时候,会见到利用ordinal方法来索引数组的代码.例如下面这个简化的类,表示一种烹饪用的香草: public class Herb { public enum Type { ANNUAL, PER ...
-
Effective Java 33 Use EnumMap instead of ordinal indexing
Wrong practice: Putting sets into an array indexed by the type's ordinal /** * Added demo for the &q ...
-
effective java——31用实例域代替序数
1,永远不要根据枚举的序数导出与它关联的值,而是要将他保存在一个实例域中.(ordinal()) public enum Ensemble { SOLO, DUET, TRIO, QUARTET, Q ...
-
Effective Java通俗理解(下)
Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...
-
《Effective Java(中文第二版)》【PDF】下载
<Effective Java(中文第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)& ...
-
《Effective Java》总结
导语 <Effective Java>是和<Thinking in java>齐名的java进阶书籍.作者参与了JDK标准库的编写工作,对于此书的学习,让我收获很多.好记性不如 ...
随机推荐
-
基于密度聚类的DBSCAN和kmeans算法比较
根据各行业特性,人们提出了多种聚类算法,简单分为:基于层次.划分.密度.图论.网格和模型的几大类. 其中,基于密度的聚类算法以DBSCAN最具有代表性. 场景 一 假设有如下图的一组数据, 生成数据 ...
-
wp8 入门到精通 仿QQPivot 提示数量
<Grid x:Name="LayoutRoot" Background="White"> <Grid Width="480&quo ...
-
iOS 第一次安装应用,拒绝相机调用,页面卡死的解决方案
void (^allowBlock)() = ^{ UIImagePickerController *imagePicker = [[UIImagePickerController alloc] in ...
-
PT100运算放大器电路
运放输出电压<=运放电源电压,电源电压能决定它的最大输出能力即动态范围,若是电源为0-5v,则输出就只能在这之间. 其次要是放大电路,反馈必须接成负反馈 由于我这次使用的电源是5V,要是采用两 ...
-
akoj-1267-独木舟上的荡漾
独木舟上的荡漾 Time Limit:1000MS Memory Limit:65536K Total Submit:76 Accepted:44 Description 进行一次独木舟的旅行活动, ...
-
CLR via C# 中关于装箱拆箱的摘录
装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...
-
排错-LR安装No&#160;Background&#160;bmp&#160;defined&#160;in&#160;...的解决办法
LR安装No Background bmp defined in section General entry BGBmp的解决办法 by:授客 QQ:1033553122 问题描述: 我在win7装L ...
-
Error #2148
参考:https://blog.csdn.net/watersevenmmfx/article/details/52980804 chrome flash 安全沙箱冲突 SecurityError: ...
-
nodejs多语句查询
执行多条查询语句 为了安全起见,默认情况下是不允许执行多条查询语句的.要使用多条查询语句的功能,就需要在创建数据库连接的时候打开这一功能: var connection = mysql.createC ...
-
从debian9、ubuntu18.04的deb包依赖来看,似乎不是那么好!!
i386体系的依赖.典型的libuuid1依赖问题,需要downgrade保持版本一致! amd64的rpm依赖低版本的perl-base,需要downgrade保持版本一致!