【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()

使用enummap,tes1t

时间: 2024-10-04 17:23:14

【Effective Java】9、使用EnumMap代替序数索引的相关文章

使用 ENUMMAP 替代序数索引

import java.util.Arrays; import java.util.EnumMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; public class Herb { public enum Type { ANNUAL, PERENNTAL, BIENNIAL } private final String nam

第33条:用EnumMap代替序数索引

有时候,会见到利用ordinal方法来索引数组的代码.例如下面这个简化的类,表示一种烹饪用的香草: public class Herb { public enum Type { ANNUAL, PERENNIAL, BIENNIAL } private final String name; private final Type type; Herb(String name, Type type) { this.name = name; this.type = type; } @Override

第六章:枚举和注解。ITEM30:用enum代替int常量。&amp;ITEM32:用EnumSet代替位域。&amp;ITEM33:用EnumMap代替序数索引。

1 package com.twoslow.cha6; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public enum Operation { 7 8 PLUS("+") { 9 @Override 10 double apply(double x, double y) { 11 return x + y; 12 } 13 },MINUS("-") { 14 @Override 15 dou

【电子书】Effective Java中文版下载

下载地址: 点击打开链接 (需要资源0分的联系我~) <Effective Java中文版(第2版)>主要内容:在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案.通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰.健壮和高效的代码.第2版反映了Java 5中最重要的变化,并删去了过时的内容. <Effective Java中文版(第2版)>中的每条规则都以简短.独立的小文章形式出现,并

Effective Java读后感

<Effective Java>读后感 1       创建和销毁对象 1.1    考虑用静态工厂方法代替构造器 静态工厂方法优点: 静态工厂方法与构造器(构造方法)不同的第一大优势在于,它们有名称.见名知意,突出区别. 静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象. 静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象. 静态工厂方法与构造器不同的第四大优势在于,在创建参数化类型实例的时候,它们使代码变得更加简洁. 例如:

《Effective Java(中文第二版)》【PDF】下载

<Effective Java(中文第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)>[PDF]"  TITLE="<Effective Java(中文第二版)>[PDF]" /> 编辑推荐 <Sun 公司核心技术丛书:EffectiveJava中文版(第2版)>内容全面,结构清晰,讲解详细.可作为技术人员的参考用书.编码平添乐

Effective java经验之谈,枚举,注解,方法,通用设计,异常

这几章看的比较快,内容就如同标题一样比较容易理解,所以只有部分内容会在[]中解释,其他的就直接理解标题,并不影响阅读质量. 不过如果时间充足的话,还是仔细读一读原书的内容,相信还是有所收获的.主要最近自己想进入算法与机器学习部分,尽快结束这本书. 另一方面,讨论一些自己感兴趣的内容,我会将搞过的东西总结下.后面可能写一部分关于java字节码阅读以及编写的东西.只所以这么来, 是因为字节码编程还是非常用途实际的,这一"java编译语言"使得String与StringBuilder的性能对

Effective Java 阅读笔记——枚举和注解

30:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 31:用实例域代替序数 应该给enum添加int域,而不是使用ordinal方法来导出与枚举关联的序数值.(几乎不应使用ordinal方法,除非在编写像EnumMap这样的基于枚举的通用数据结构) //WRONG public enum Fruit{ APPLE, PEAR, ORANGE; public int numberOfFruit(

[Effective Java]第六章 枚举和注解

第六章      枚举和注解 30.      用enum代替int常量 枚举类型是指由一组固定的常量组成合法值的类型,例如一年中的季节或一副牌中的花色.在没引入枚举时,一般是声明一组int常量,每个类型成员一个常量: public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public sta