`

枚举类型进阶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实例得到“枚举的枚举”的值。
分享到:
评论

相关推荐

    枚举类型的复杂用法:非常有用的枚举类型使用例子,简化了数据采集通道的定义。

    非常有用的枚举类型使用例子,简化了数据采集通道的定义。

    Delphi 枚举类型操作 Demo

    演示如何操作Delphi 的枚举类型。 1. 包含源代码; 2. 包含执行程序 3. 演示如下函数如何使用:GetEnumName、GetEnumProp、GetEnumValue、SetEnumProp 4. 非常简单,一看就会。

    C语言程序设计-枚举类型.pptx

    5-1 枚举类型的定义 有些变量的取值仅限于可一一列举出来的几个固定值。C语言设置了枚举类型。 枚举类型定义的一般形式为: enum 枚举名 { 枚举值表 }; 在枚举值表中应罗列出所有可用值,这些值也称为枚举元素。 ...

    C++枚举类型enum与enum class的使用

    1. 什么是枚举类型? 答:如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:性别只有男和女,那么就可以将性别定义为一种枚举类型,其中男和女就是性别所包含的变量。所谓”枚举”是指将变量的值...

    LearnJava:了解Java

    学习Java 了解有关JAVA for ME的信息! 指数 进阶主题 :ArrayList的差异之间的VS矢量 :可比较与比较器之间的区别 ...ThreadStatesEnum.java :枚举类型정리및枚举类型 JavaEnumExample.java :

    易语言模拟枚举类型

    易语言模拟枚举类型源码,模拟枚举类型,初始化枚举类型

    Java枚举类的使用与注解

    四、使用enum关键字定义的枚举类实现接口的情况 栗子一:实现接口,在enum类中实现抽象方法。 栗子二:让枚举类的 对象分别实现接口中的抽象方法。 五、注解(Annotation)概述 二、常见的Annotation 示例: 六、...

    PHP 枚举类型的管理与设计知识点总结

    一种常见的方式是,使用常量来代表枚举类型 const YES = '是'; const NO = '否'; 可以在这个基础上更进一步,将其封装成类,以便于管理 class BoolEnum { const YES = '是'; const NO = '否'; } 现在,我们希望...

    springboot项目中枚举类型的最佳实践

    前端传枚举名称给后端接口,序列化器自动将其转换成对应的枚举值code。 后端业务传枚举名称给数据库,序列化器自动将其转换成对应的枚举值code。 springboot项目中枚举类型的最佳实践

    thinkPHP调用枚举类型

    thinkPHP调用枚举类型,里面根据参数不同返回值不同,初步只封装了input(radio、check)、td、select等。

    QML 中使用 C++定义的枚举类型

    如果要在 QML使用 C++中定义的类型,有些数据类型是是可以直接使用的,如常见的 int,但是还有一些相对特殊的类型就需要做些特定的操作才可以使用了。 博客地址:...

    hibernate映射枚举类型

    hibernate映射枚举类型,hibernate如何映射枚举类型

    Unity-C#-遍历枚举,通过枚举对象获取枚举类型.txt

    枚举参数与对象类型进行比较,判断是否属于同一类型

    C# 枚举类型的实例说明

    C# 枚举类型的实例说明,描述了枚举类型的主要使用方法

    理解java枚举类型

    理解java枚举类型

    C++枚举类型实例

    C++枚举类型的简单实例,设置了enum result{win,lose,tie,cancle} 实现了这四种情况的顺序输出。

    ActionScript3.0 枚举类型的使用

    ActionScript3.0 枚举类型的使用 ActionScript3.0 中创建枚举类型

    枚举(switch、覆盖枚举、实现接口等)

    用法六:使用接口组织枚举 public interface Food { enum Coffee implements Food{ BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO } enum Dessert implements Food{ FRUIT, CAKE, GELATO } }

    C语言重点知识总结梳理

    19. C语言自定义类型-枚举和联合 动态内存分配: 20. C语言动态内存分配 21. C语言柔性数组 应用: 22. C语言动态通讯录改造 文件操作相关的知识: 23. C语言文件操作 应用: 24. C语言文件改造通讯录 最后: 25. ...

    Java枚举类型Enum的用法

    NULL 博文链接:https://rensanning.iteye.com/blog/2013734

Global site tag (gtag.js) - Google Analytics