展开全部

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自62616964757a686964616fe59b9ee7ad9431333236366331己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。

1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。

2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。

3.Enum默认实现了java.lang.Comparable接口。

4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.

5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。

6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。

7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。

了解了这些基本特性,我们来看看如何使用它们。

1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。

for (Color c: Color.values())

System.out.println(“find value:” + c);

2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。

public enum Color {

Red,

Green,

Blue;

/*

*定义一个变量表示枚举值的数目。

*(我有点奇怪为什么sun没有给enum直接提供一个size方法).

*/

private static int number = Color.values().length ;

/**

* 随机返回一个枚举值

@return a random enum value.

*/

public static Color getRandomColor(){

long random = System.currentTimeMillis() % number;

switch ((int) random){

case 0:

return Color.Red;

case 1:

return Color.Green;

case 2:

return Color.Blue;

default : return Color.Red;

}

}

}

可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。

3.覆载(Override)toString, valueOf方法

前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。

….

public String toString(){

switch (this){

case Red:

return "Color.Red";

case Green:

return "Color.Green";

case Blue:

return "Color.Blue";

default:

return "Unknow Color";

}

}

….

这时我们可以看到,此时再用前面的遍历代码打印出来的是

Color.Red

Color.Green

Color.Blue

而不是

Red

Green

Blue.

可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。

4.使用构造函数

虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。

public enum Color {

Red("This is Red"),

Green("This is Green"),

Blue("This is Blue");

private String desc;

Color(String desc){

this.desc = desc;

}

public String getDesc(){

return this.desc;

}

}

这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。

要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。

5.实现特定的接口

我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。

6.定义枚举值自己的方法。

前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。

public enum Color {

Red {

public String toString(){

return "Color.Red";

}

},

Green {

public String toString(){

return "Color.Green";

}

},

Blue{

public String toString(){

return "Color.Blue";

}

};

}

从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。

总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个

人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

java枚举类型定义_java中的枚举类型怎么定义?相关推荐

  1. java 枚举类 扑克牌_Java中的枚举和多态,扑克牌示例

    我尝试设计一个关于扑克牌的项目.我有一张卡片 class Card { Rank rank; Suit suit; } 西装是一个枚举. enum Suit { .... } Rank应该有一个方法g ...

  2. java 枚举不能继承_Java中的枚举类为何不能有public构造器

    从Java 5開始有了枚举类,须要注意的是enum定义的类默认继承的是java.lang.Enum类而不是Object类. 同一时候注意枚举类不能派生子类(类的默认修饰符为final).其原因基于它仅 ...

  3. java 类型通配符_java中泛型之类型通配符(?)

    实体类 package cn.xy.model; /** * 生物类 * @author xy * */ public class Living { private String name; publ ...

  4. java通过poi读取excel中的日期类型数据或自定义类型日期

    java通过poi读取excel中的日期类型数据或自定义类型日期 Java 读取Excel表格日期类型数据的时候,读出来的是这样的  12-十月-2019,而Excel中输入的是 2019/10/12 ...

  5. java 枚举_Java中的枚举类型(Enum)详解

    文章前记 程序员工作久了便可能整日忙碌于"增删改查"中,迷失方向,毫无进步. 该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路! 努力!做一个NB的Co ...

  6. java定义枚举并赋值_java中枚举的特性是什么?如何赋值?

    上次已经为大家介绍过java枚举的概念是什么的主要内容了.今天再来为大家介绍一些相关的知识,也是关于java枚举的一些内容,也就是它的特性以及如何赋值,一起来了解一下吧. 首先说一下,java中枚举的 ...

  7. java 7种枚举类型_Java中的枚举类型

    枚举类比较用 == 还是 equals,有啥区别? java 枚举值比较用 == 和 equals 方法没啥区别,两个随便用都是一样的效果.因为枚举 Enum 类的 equals 方法默认实现就是通过 ...

  8. java枚举的特点_Java中有些好的特性(二):枚举

    前言 我在写上一篇时,开始选了一个很土的名字"Java超过C#的地方",然后引起了某些同学的不满,后来修改了个名.我在这里再次申明一下,我没有贬低任何语言之意,纯粹是从一个.NET ...

  9. java中的枚举_Java中的枚举

    java中的枚举 Enum was introduced in Java 1.5 as a new type whose fields consists of a fixed set of const ...

最新文章

  1. 用fgets()函数以字符串形式读取磁盘文件并输出到屏幕
  2. oracle11g安装中的问题
  3. java 线程分配_Java多线程原子引用分配
  4. BootStrap中对input的type自带的验证种类
  5. vue 时间插件_Vue3 插件开发详解尝鲜版「值得收藏」
  6. rgb红色范围_【论文阅读18】RGB-D Object-Oriented Semantic Mapping
  7. Linux、Mac、windows 系统下 配置Python虚拟环境 virtualenvwrapper教程,workon切换环境, 非常简单方便
  8. ORA-01034:ORACLE not available问题的解决方法
  9. .NET-MVC站点部署到windows server2008r2服务器404错误
  10. Swift - 使用UIScrollView实现页面滚动切换
  11. 股票数据分析查询接口,股票数据接口,沪深港股,股票api查询
  12. 红米6 Pro开启ROOT权限的教程
  13. python虚线画田字格_[Matplotlib官方示例教程]第19课.自定义虚线样式
  14. 16.opengl-qt 基础光照
  15. Springboot文件上传报错:failed to convert java.lang.String to org.springframework.util.unit.DataSize
  16. 如何在路演中获得投资机会|兆骑科创
  17. MogaFX—日元兑美元30多年来首次突破150日元
  18. Arduino基础入门套件教程PDF
  19. 如何利用OMIM数据库获取肿瘤相关所有突变基因?
  20. Ubuntu18.04使用anaconda3安装tensorflow-gpu、pytorch

热门文章

  1. 百万荐才奖励,2022年武汉市“3551荐才企业名录”申报条件以及奖励补贴政策汇总
  2. MindManager盘点——舌尖上的中国
  3. 企业如何实现内容多渠道一键合规投放?
  4. Weblogic:AdminServer.lok被锁导致启动、关闭域失败
  5. 《Imbalance problems in object detection: A review》笔记
  6. 像程序员一样思考之一
  7. php基于BS模式的物业管理系统设计与实现毕业设计源码290918
  8. 起点中文网小说文本分类项目【简易上手的nlp实战项目】
  9. 【韩流馆科技】大博智能家居带你体验创新科技世界
  10. 小程序(十)小程序缓存