`

枚举类型进阶1:使用接口组织枚举

阅读更多
    对于enum而言,实现接口是其实现子类化的唯一办法。在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组,可以达到将枚举元素分类组织的目的。如下示例,用enum来表示不同类别的食物,但同时希望每个enum元素仍然保持Food类型。
   
package enumerated.menu;
import net.mindview.util.*;

public enum Meal2 {
	APPETIZER(Food.Appetizer.class), MAINCOURSE(Food.MainCourse.class), DESSERT(
			Food.Dessert.class), COFFEE(Food.Coffee.class);
	private Food[] values;

	private Meal2(Class<? extends Food> kind) {
		values = kind.getEnumConstants();
	}

	public interface Food {
		enum Appetizer implements Food {
			SALAD, SOUP, SPRING_ROLLS;
		}

		enum MainCourse implements Food {
			LASAGNE, BURRITO, PAD_THAI, LENTILS, HUMMOUS, VINDALOO;
		}

		enum Dessert implements Food {
			TIRAMISU, GELATO, BLACK_FOREST_CAKE, FRUIT, CREME_CARAMEL;
		}

		enum Coffee implements Food {
			BLACK_COFFEE, DECAF_COFFEE, ESPRESSO, LATTE, CAPPUCCINO, TEA, HERB_TEA;
		}
	}

	public Food randomSelection() {
		return Enums.random(values);
	}

	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			for (Meal2 meal : Meal2.values()) {
				Food food = meal.randomSelection();
				System.out.println(food);
			}
			System.out.println("---");
		}
	}
}


  下面是Enums工具类,实现从枚举实例中随机选择,<T extends Enum<T>>表示T是一个枚举实例。将Class<T>作为参数,就可以利用Class对象得到enum实例的数组了。重装后的random()方法只需要使用T[]作为参数,它从数组中随机选择一个元素。
 
//: net/mindview/util/Enums.java
package net.mindview.util;
import java.util.*;

public class Enums {
  private static Random rand = new Random(47);
  public static <T extends Enum<T>> T random(Class<T> ec) {
    return random(ec.getEnumConstants());
  }
  public static <T> T random(T[] values) {
    return values[rand.nextInt(values.length)];
  }
} ///:~

输出结果:
SPRING_ROLLS
VINDALOO
FRUIT
DECAF_COFFEE
---
SOUP
VINDALOO
FRUIT
TEA
---
SALAD
BURRITO
FRUIT
TEA
---
SALAD
BURRITO
CREME_CARAMEL
LATTE
---
SOUP
BURRITO
TIRAMISU
ESPRESSO
---
     嵌入在Food中的每个enum都实现了Food接口,该接口的作用就是将其所包含的enum组合成一个公共类型,这一点是必要的。然后Meal2才能将Food中的enum作为构造器参数使用,每一个Meal2实例都将其对应的class实例对象作为构造器参数。通过getEnumConstants()方法,可以取得某个Food子类的所有enum实例。这些实例在randomSelection中被用到。因此可以从Meal2实例中随机选择一个Food,生成一份菜单。我们通过遍历每一个Meal2实例得到“枚举的枚举”的值。
分享到:
评论

相关推荐

    C语言进阶(含代码)

    - **特定用途的数据类型**:除了基本数据类型,C语言还支持如枚举类型(`enum`)、结构体(`struct`)、联合体(`union`)等,这些类型用于解决更复杂的数据表示问题,例如结构体可以用来组合不同类型的数据成为一个...

    java语言程序设计基础进阶篇代码

    - **枚举**:了解枚举类型,以及其在常量集合和设计模式中的应用。 - **异常分类**:学习检查异常和运行时异常的差异,了解异常链和自定义异常。 通过这个压缩包中的习题代码,你可以实践这些知识点,逐步提高...

    C#进阶教程原版电子书 入门/提高都适合的好东东!

    1. **泛型**:泛型是C#中一个强大的特性,允许创建类型参数化的类、接口和方法。这提高了代码的灵活性和重用性,同时减少了类型转换的需要。 2. **LINQ(Language Integrated Query)**:C#的查询语法使得数据查询...

    java基础与进阶资料

    此外,“一些高级类的使用与进阶知识”可能涉及到抽象类、接口、枚举、匿名类等,这些都是Java中比较高级的主题。 至于“第一本java”这个子文件名,通常意味着这是系列教程的第一部分,可能主要关注Java的基础知识...

    Java2核心技术卷一:基础知识

    13. **枚举类型**:介绍Java中的枚举类型,包括枚举常量、枚举方法和枚举关联类。 14. **注解**:讲解注解的定义、使用和元注解,以及如何自定义注解。 15. **多线程**:涵盖线程的创建与管理,同步控制...

    java语言程序设计基础与进阶 (第六版)

    11. **枚举与注解**:枚举类型为常量提供了一种安全的表示方式,注解则为代码添加元数据,用于编译时或运行时的处理。这两者都是Java中独特的语言特性。 12. **JavaFX**:对于GUI编程,JavaFX提供了一套现代的图形...

    SCJP.basic1.rar_scjp

    10. **枚举类型**:学习Java 5引入的枚举类型,了解其特点和优势,以及如何创建和使用枚举。 11. **集合框架**:掌握ArrayList、LinkedList、HashSet、HashMap等主要集合类的用法,理解泛型的概念和使用,以及迭代...

    ios 进阶 建造者模式

    1. **对象的构建与使用分离**:建造者模式中,构建过程由一个专门的Builder类来完成,而客户端则只需要通过Director类来指导Builder如何构建,这样可以避免客户端直接参与构建过程,简化了客户端代码。 2. **多步骤...

    C++程序设计_面向对象进阶_C++_

    9. **C++11及其以后的更新**:自C++11起,语言经历了重大更新,引入了lambda表达式、右值引用、自动类型推断(auto)、范围for循环、强类型枚举等新特性,提升了C++的现代性和效率。 10. **内存管理**:理解C++的...

    go语言编程教程(go-0.1-0.3)

    1. **构建包**:讲解如何组织代码为独立的包,并导入其他包进行使用。 2. **标识符**:介绍如何正确使用包名和变量名避免命名冲突。 3. **文档注释**:强调编写清晰文档的重要性,包括如何使用`godoc`工具生成API...

    Java程序设计讲义

    5. **枚举与注解**:枚举类型的使用,以及自定义注解的创建和使用。 6. **反射机制**:利用反射动态获取类信息,创建对象,调用方法,以及动态代理。 **四、实验指导书** 附带的《实验指导书(含1-5)》提供了实践...

    J2SE进阶(技术提高)

    学习这些接口和类的特性和用法,能帮助你更好地组织和管理数据。 4. **IO 流**:Java IO 包提供了大量类用于输入/输出操作,包括字节流、字符流、对象流和文件操作。NIO(New IO)引入了通道(Channels)和缓冲区...

    JAVA 2实用教程(第4版) 1-9课件与1-16代码

    - **枚举类型**:安全的常量表示,支持方法和继承。 - **注解**:元数据,提供编译时和运行时的信息,如@Override和@Autowired。 这些课件和代码示例将帮助学习者逐步掌握Java编程的核心概念和实际应用,为后续...

    rust编程指南

    模式匹配是一种功能强大的结构,用于处理枚举类型的值。 4. 泛型、trait与生命周期: - 泛型:Rust的泛型允许你编写不特定于任何类型的代码,它们提供了一种编写可重用代码的方法。 - trait:Trait类似于其他语言...

    swift2.0中文完整版

    - **接口和扩展**: 扩展可以用来扩展已有的类型的功能,而协议则定义了某个类型应该具有的行为。 - **泛型**: 泛型允许你在编写函数或类型时使用任意类型。 #### 二、Swift 基础部分 **2.1 基础部分** - **常量和...

    core java 第十版

    7. **枚举类型**:学习Java中的枚举类型,用于表示固定数量的值。 8. **包和模块系统**:掌握Java的包管理机制,以及Java 9引入的模块系统,这对于大型项目组织和依赖管理至关重要。 9. **注解(Annotation)**:...

    java JDK 实例开发宝典

    Java JDK实例开发宝典是一本面向Java初学者和进阶者的指南,主要基于J2SE 5.0版本,这个版本是Java发展历程中的一个重要里程碑,引入了许多新的特性和改进,如泛型、枚举类型、可变参数以及增强的for循环等。...

    Java基础书籍

    2. **枚举和注解**:学习如何使用枚举类型以及注解来增强代码的可读性和可维护性。 3. **高级IO和NIO**:介绍Java的非阻塞I/O模型,如通道、缓冲区和选择器,用于提高并发性能。 4. **网络编程**:理解如何利用Java ...

Global site tag (gtag.js) - Google Analytics