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. Effective Java笔记一 创建和销毁对象

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

  2. java笔记00-目录

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

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

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

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

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

  5. Java基础知识强化之网络编程笔记19:Android网络通信之 HttpClient和传统Post、Get方式的区别

    1. HttpClient是什么 ?     HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 ...

  6. Java基础知识强化之集合框架笔记19:List集合迭代器使用之 并发修改异常的产生原因 以及 解决方案

    1. 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. ConcurrentModi ...

  7. Java基础知识强化之IO流笔记19:FileOutputStream的三个write方法

    1. FileOutputStream的三个write方法:  void write(byte[] buffer)           Writes the entire contents of th ...

  8. java新手笔记19 抽象类

    1.Shap package com.yfs.javase; public class Shape /*extends Object */{ //默认继承object object方法全部继承 //计 ...

  9. java笔记--理解java类加载器以及ClassLoader类

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...


  1. SQL 谜题(父亲的邮票)

    问题:父亲需要些1分,2分,3分,5分,10分的邮票, 其中两种各买四张,另外的三种各买三张 我忘记是哪几种了?他给了我一些10分硬币,金额刚好买这些邮票 计算及分析过程: --通过极限算法,若都是3 ...

  2. 在网页中让Backspace按键不可作为退回使用

    这也是转载的,让BackSpace按键不可作为退回使用,在textbox中设置readonly时,将退回禁用. <script type="text/javascript"& ...

  3. ztree学习之异步加载节点(一)

    ztreedemo.jsp: <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  4. GC算法 垃圾收集器

    GC算法 垃圾收集器 参考:http://www.cnblogs.com/ityouknow/p/5614961.html 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它 ...

  5. PCB特征阻抗计算神器Polar SI9000安装及破解指南

    近年来,IC集成度的提高和应用,其信号传输频率和速度越来越高,因而在印制板导线中,信号传输(发射)高到某一定值后,便会受到印制板导线本身的影响,从而导致传 输信号的严重失真或完全丧失.这表明,PCB导 ...

  6. 函数xdes_set_bit

    /**********************************************************************//** Sets a descriptor bit of ...

  7. [iOS 多线程 &amp; 网络 - 1.0] - 多线程概述

    A.进程 什么是进程进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活 ...

  8. JS 函数调用

    Js函数调用的方式有如下几种情况: (1)具名函数直接调用 function foo() { } foo(); (2)匿名函数通过引用来调用 fooRef = function() { } fooRe ...

  9. 【转】图解SQL的各种连接join

    原帖地址:http://www.nowamagic.net/librarys/veda/detail/936 图解SQL的各种连接join 让你对SQL的连接一目了然 在 2011年12月22日 那天 ...

  10. Java 8 与 .Net的平台发展

    从早期版本中,我们已经可以领略到一些令人兴奋的特性.但是开发真Andrew C.Oliver表示,尽管如此,Java语言在某些特性上还是落后于.Net.比如,Java 8 中最令人期待的Lambda表 ...