Enumerated Types


Basic enum features

  • When you create an enum, an associated class is produced for you by the compiler. This class is automatically inherited from java.lang.Enum.
  • The ordinal( ) method produces an int indicating the declaration order of each enum instance, starting from zero.

Using static imports with enums

  • Is it better to be explicit and qualify all enum instances? It probably depends on the complexity of your code.

Adding methods to an enum

  • Except for the fact that you can’t inherit from it, an enum can be treated much like a regular class.
  • You may want to produce different descriptions for an enumeration than the default toString( ).
  • If you are going to define methods you must end the sequence of enum instances with a semicolon.
  • Java forces you to define the instances as the first thing in the enum.
  • The constructor can only be used to create the enum instances that you declare inside the enum definition.
  • The compiler won’t let you use it to create any new instances once the enum definition is complete.

Overriding enum methods

  • Overriding the toString( ) method for an enum is the same as overriding it for a regular class.

enums in switch statements

  • Ordinarily, a switch only works with an integral value, but since enums have an established integral order and the order of an instance can be produced with the ordinal( ) method, enums can be used in switch statements.
  • Although normally you must qualify an enum instance with its type, you do not have to do this in a case statement.
  • The compiler does not complain that there is no default statement inside the switch.
  • On the other hand, if you are calling return from case statements, the compiler will complain if you don’t have a default.

The mystery of values()

  • If you look at Enum, you’ll see that there is no values( ) method, even though we’ve been using it.
  • values( ) is a static method that is added by the compiler.
  • In the output, you can see that Explore has been made final by the compiler, so you cannot inherit from an enum.
  • Because values( ) is a static method inserted into the enum definition by the compiler, if you upcast an enum type to Enum, the values( ) method will not be available.
  • Even if values( ) is not part of the interface of Enum, you can still get the enum instances via the Class object.

Implements, not inherits

  • All enums extend java.lang.Enum. Since Java does not support multiple inheritance, this means that you cannot create an enum via inheritance.
  • It is possible to create an enum that implements one or more interfaces.

Using interfaces for organization

  • The motivation for inheriting from an enum comes partly from wanting to extend the number of elements in the original enum, and partly from wanting to create subcategories by using subtypes.
  • You can achieve categorization by grouping the elements together inside an interface and creating an enumeration based on that interface.
  • Another, more compact, approach to the problem of categorization is to nest enums within enums.

Using EnumSet instead of flags

  • An enum requires that all its members be unique, so it would seem to have set behavior, but since you can’t add or remove elements it’s not very useful as a set.
  • Internally, it is represented by (if possible) a single long that is treated as a bit-vector, so it’s extremely fast and efficient.
  • EnumSets are built on top of longs, a long is 64 bits, and each enum instance requires one bit to indicate presence or absence. This means you can have an EnumSet for an enum of up to 64 elements without going beyond the use of a single long.

Using EnumMap

  • An EnumMap is a specialized Map that requires that its keys be from a single enum.
  • An EnumMap can be implemented internally as an array.
  • You can only call put( ) for keys that are in your enum, but other than that it’s like using an ordinary Map.
  • The order of elements in the EnumMap is determined by their order of definition in the enum.
  • An EnumMap allows you to change the value objects, whereas constant-specific methods are fixed at compile time.

Constant-specific methods

  • You define one or more abstract methods as part of the enum, then define the methods for each enum instance.
  • You can look up and call methods via their associated enum instance.
  • Each instance is a distinct type.
  • You cannot treat enum instances as class types.
  • Because they are static, enum instances of inner enums do not behave like ordinary inner classes.
  • It is possible to override constant-specific methods, instead of implementing an abstract method.

Chain of Responsibility with enums

  • In the Chain of Responsibility design pattern, you create a number of different ways to solve a problem and chain them together.
  • When a request occurs, it is passed along the chain until one of the solutions can handle the request.
  • Each strategy is tried in turn until one succeeds or they all fail.

State machines with enums

  • Enumerated types can be ideal for creating state machines.
  • Because enums restrict the set of possible cases, they are quite useful for enumerating the different states and inputs.

Multiple dispatching

  • Java only performs single dispatching.
  • If you are performing an operation on more than one object whose type is unknown, Java can invoke the dynamic binding mechanism on only one of those types.
  • If you want double dispatching, there must be two method calls: the first to determine the first unknown type, and the second to determine the second unknown type.
  • Generally, you’ll set up a configuration such that a single method call produces more than one virtual method call and thus services more than one type in the process.

Dispatching with enums

  • You can’t use enum instances as argument types.
  • There are a number of different approaches to implementing multiple dispatching which benefit from enums.

Using constant-specific methods

  • Because constant-specific methods allow you to provide different method implementations for each enum instance, they might seem like a perfect solution for setting up multiple dispatching.

Dispatching with EnumMaps

  • It’s possible to perform a "true" double dispatch using the EnumMap class, which is specifically designed to work very efficiently with enums.

Using a 2-D array

  • A two-dimensional array mapping the competitors onto the outcomes produces the smallest and most straightforward solution.
  • It’s not quite as "safe" as the previous examples because it uses an array.

Thinking in Java——笔记(19)的更多相关文章

  1. Java笔记19:Java匿名内部类

    匿名内部类也就是没有名字的内部类.正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写.但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 例1:不使用匿名内部类来实现抽象方 ...

  2. JAVA自学笔记19

    JAVA自学笔记19 1.集合总结 Collection(单列集合) List(有序可重复) ArrayList:底层数据结构是数组 ,查询快,增删慢.线程不安全,效率高 Vector:底层数据结构是 ...

  3. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

  4. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

  5. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  6. java笔记00-目录

    --2013年7月26日17:49:59 学习java已久,趁最近有空,写一个总结: java笔记01-反射:

  7. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  8. Java笔记(二十五)……其他常用API

    System类 工具类全部都是静态方法 常用方法 获取系统属性信息 static PropertiesgetProperties() static StringgetProperty(String k ...

  9. SQL反模式学习笔记19 使用*号,隐式的列

    目标:减少输入 反模式:捷径会让你迷失方向 使用通配符和未命名的列能够达到减少输入的目的,但是这个习惯会带来一些危害. 1.破坏代码重构:增加一列后,使用隐式的Insert插入语句报错: 2.查询中使 ...

随机推荐

  1. 《Entity Framework 6 Recipes》中文翻译系列 (24) ------ 第五章 加载实体和导航属性之查询内存对象

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-4  查询内存对象 问题 你想使用模型中的实体对象,如果他们已经加载到上下文中, ...

  2. 【NodeJS 学习笔记04】新闻发布系统

    前言 昨天,我们跟着这位大哥的博客(https://github.com/nswbmw/N-blog/wiki/_pages)进行了nodeJS初步的学习,最后也能将数据插入数据库了 但是一味的跟着别 ...

  3. Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx

    Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx 分类 图像处理知识点体系 v2 qb24.xlsx 分类 分类 理论知识 图像金字塔 常用底层操作 卷积扫描 ...

  4. JQuery图片切换动画效果

    由于博主我懒,所以页面画的比较粗糙,但是没关系,因为我主要讲的是如何实现图片动画切换. 思路:想必大家都逛过淘宝或者其他的一些网站,一般都会有图片动画切换的效果,那是怎样实现的呢?博主我呢,技术不是很 ...

  5. 导入镜像文件,分区启动liunx

    1:更改虚拟机配置 2:导入系统镜像 3:启动虚拟机,选择第一个选项回车 4:这里问你是否检查镜像,我们的镜像肯定没问题不需要检查,点击Skip 5:语言选择,按提示默认下一步 6:主机名也默认 7: ...

  6. 浅谈cssText

    给一个HTML元素设置css属性,如 var head= document.getElementById("head"); head.style.width = "200 ...

  7. C#设计模式系列:代理模式(Proxy)

    代理模式提供了一个中介控制对某个对象的访问.现实生活中,我们可能会用支票在市场交易中用来代替现金,支票就是账户中资金的代理. 1.代理模式简介 1.1>.定义 代理模式(Proxy)定义:代理模 ...

  8. Android之线程池深度剖析

    1.线程池的引入   引入的好处:   1)提升性能.创建和消耗对象费时费CPU资源   2)防止内存过度消耗.控制活动线程的数量,防止并发线程过多.   使用条件:      假设在一台服务器完成一 ...

  9. es6学习笔记一数组(下)

    entries() 方法: 概述:    entries() 方法返回一个 Array Iterator(数组迭代) 对象,该对象包含数组中每一个索引的键值对. 示例: let arr = [&quo ...

  10. 创建 floating IP - 每天5分钟玩转 OpenStack(106)

    先复习一下前面我们讨论的知识. 当租户网络连接到 Neutron router,通常将 router 作为默认网关.当 router 接收到 instance 的数据包,并将其转发到外网时: 1. r ...