第六章:枚举和注解。ITEM30:用enum代替int常量。&ITEM32:用EnumSet代替位域。&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         double apply(double x, double y) {
16             return x - y;
17         }
18     },TIMES("*")  {
19         @Override
20         double apply(double x, double y) {
21             return x * y;
22         }
23     },DIVIDE("/"){
24         @Override
25         double apply(double x, double y) {
26             return x / y;
27         }
28     };
29
30     private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>() ;
31
32     //将定制的字符串表示法变回相应的枚举。
33     static {
34         for(Operation op : values()) {
35             stringToEnum.put(op.toString(), op) ;
36         }
37     }
38
39     public static Operation fromString(String symbol) {
40         return stringToEnum.get(symbol) ;
41     }
42
43     private final String symbol ;
44
45     Operation(String symbol) {
46         this.symbol = symbol ;
47     }
48
49     public String toString() {
50         return symbol ;
51     }
52
53     abstract double apply(double x  ,double y) ;
54 }
1 public class Text {
2   public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }
3   public void applyStyles(Set<Style> styles) { ... }
4
5 }
6 //使用方式如下:
7 text.applyStyles(EnumSet.of(Style.BOLD,Style.ITALIC));

在一个花园里面有很多的植物,它们被分成 3 类,分别是一年生(ANNUAL)、多年生(PERENNIAL)和两年生(BIENNIAL),正好对应着 Herb.Type 中的枚举值。

现在我们需要做的是遍历花园中的每一个植物,并将这些植物分为 3 类,最后再将分类后的植物分类打印出来:

 1 package com.twoslow.cha6;
 2
 3 public class Herb {
 4     public enum Type { ANNUAL, PERENNIAL, BIENNIAL }
 5     private final String name;
 6     private final Type type;
 7
 8     Herb(String name, Type type) {
 9         this.name = name;
10         this.type = type;
11     }
12
13     @Override
14     public String toString() {
15         return name;
16     }
17 }
 1 public static void main(String[] args) {
 2         Herb[] garden = ...;
 3         Map<Herb.Type, Set<Herb>> herbsByType =new EnumMap<Herb.Type, Set<Herb>>(Herb.Type.class);
 4
 5         for (Herb.Type t : Herb.Type.values()) {
 6             herbsByType.put(t, new HashSet<Herb>());
 7         }
 8         for (Herb h : garden) {
 9             herbsByType.get(h.type).add(h);
10         }
11         System.out.println(herbsByType);
12     }
时间: 2024-11-08 23:24:44

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

[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

[Effective Java 读书笔记] 第6章 枚举和注解

第三十条 用enum代替int 总得来说,使用enum有几点好处 1.编译时的类型安全, 2.可以保证就是自己定义的值,不会有月结风险, 3.每个枚举类型有自己的命名空间 4.枚举可以添加任意的方法和域 5.枚举类型是final的无法实例化,也就是实例可控的.. 第三十一条 用实例域替代序数 即不要依赖枚举值得定义顺序来指定他们的值,而应该讲枚举保存在一个实例域中,类似厦门的value值: public enum RewardType { RMB(1), OBJECT(2), ZAN(3), O

《Effective Java》第6章 枚举和注解

第30条:用enum代替int常量 将加班工资计算移到一个私有的嵌套枚举中,将这个策略枚举(strategy enum)的实例传到PayrollDay枚举的构造器中.之后PayrollDay枚举将加班工资计算委托给策略枚举: 以上,方法overtimePay()在每个枚举类示例中实现,对外提供一致的pay()方法. 第31条:用实例域代替序数 永远不要根据枚举的序数导出与它关联的值.而是要将它保存在一个实例域中: 第33条:用EnumMap代替序数索引 现在假设有一个香草的数组.表示一座花园中的

编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)

建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类".工厂方法模式在我们的开发中经常会用到.下面以汽车制造为例,看看一般的工厂方法模式是如何实现的,代码如下: 1 //抽象产品 2 interface Car{ 3 4 } 5 //具体产品类 6 class FordCar implements Car{ 7 8 } 9 //具体产品类 10 class B

用枚举enum替代int常量

枚举的好处: 1. 类型安全性 2.使用方便性 public class EnumDemo { enum Color{ RED(3),BLUE(5),BLACK(8),YELLOW(13),GREEN(28); private int colorValue; private Color(int rv){ this.colorValue=rv; } private int getColorValue(){ return colorValue; } private int value(){ retu

SpringBoot | 第六章:常用注解介绍及简单使用

前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志 配置等.这章节开始,开始总结一些关于springboot的综合开发的知识点.由于SpringBoot本身是基于Spring和SpringMvc等各类spring家族的一个解决方案,可快速进行集合.故相关知识点其实大部分都是基于spring或者springmvc既有的知识点的.本章节,主要讲解的是关于web开发及springboot独有的一些常用注解进行说明. 常用注解 总结 最后 老生常谈 常用注解 @Spring

Item 30 用enum代替int常量类型枚举,string常量类型枚举

1.用枚举类型替代int枚举类型和string枚举类型 public class Show { // Int枚举类型 // public static final int APPLE_FUJI = 0; // public static final int APPLE_PIPPIN = 1; // public static final int APPLE_GRANNY_SMITH = 2; public enum Apple { FUJI, PIPPIN, GRANNY_SMITH } pub

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

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

Effective Java 读书笔记之五 枚举和注解

Java1.5中引入了两个新的应用类型家族,新的类为枚举类型,新的接口为注解类型. 一.用enum代替int常量 1.枚举值由一组固定的常量组成合法值的类型. 二.用实例域代替序数 1.不要根据枚举的序数导出它关联的值,而是把它保存在一个实例域中. 三.用EnumSet代替位域模式 1.如果有枚举类型需要用在集合中,EnumSet就是最好的工具. 四.用EnumMap代替序数索引功能 1.EnumMap更加安全和可靠. 五.用接口模拟实现可伸缩的枚举 1.可伸缩的枚举类型,一般不是一个好主意.