java中的枚举到底有啥作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的枚举到底有啥作用?相关的知识,希望对你有一定的参考价值。

枚举是一种规范它规范了参数的形式,这样就可以不用考虑类型的不匹配并且显式的替代了int型参数可能带来的模糊概念 枚举像一个类,又像一个数组。

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个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;

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

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的一些高级特性,否则就和简单易懂的初衷想违背了。
参考技术A 枚举是一种规范它规范了参数的形式,这样就可以不用考虑类型的不匹配并且显式的替代了int型参数可能带来的模糊概念 枚举像一个类,又像一个数组。

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个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;

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

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作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂
在Java中,枚举类型本质上其实就是一个类,枚举中的常量都是该枚举类型的实例。虽然枚举类型有一些限制,比如不能再派生出子枚举类型,不能调用构造函数,不过我们仍然可以在枚举类型中定义构造函数、字段和方法
参考技术B 简单说:枚举可以限定取值范围,所有的内容只能从指定范围中取得.
比如性别,只有男和女,其他值都是不合法的
如果不用枚举也可以构造这样的方法,但可能要做更多的工作,也可能不安全
但运用枚举,就可以避免这些问题了
希望对你有帮助
参考技术C 楼上的同学……光说不给例子没用,光给例子不说也没用啊。
其实枚举就是在一个类里定义几个静态变量,每个变量都是这个类的实例。
比如说,类Human有两个静态变量:Man,Woman,每一个变量都是Human类的实例。用的时候就直接写Human.Man,Human.Woman,用的时候就直接用Human.Man.hasXJJ()或者Human.Woman.hasXJJ()方法,这不就是枚举么。
作用么,其实就是提供常量。
好处么,三言两语说不完,用着用着就明白了。
参考技术D 个人理解就是:对于现实中的一些常识或自己在设计中有不需要改变一类对象的属性,某类对象的属性,方法是可数且可知的,我们不需要对其进行改变的,就可以用这种方法去定义该类。用法:对类封装固定对象,其中的对象是有限的,属性可以固定设置,比如描写一个星期的类,从星期一到星期天,可以对星期一设一个英语属性为Monday,是一个星期中的第一天,星期二为Tuesday,是一个星期的第二天,依此可设置完其他五天,这样,封装星期的这个类就很明了,实用了

Java 8 中的抽象类和接口到底有啥区别?

上一篇栈长发了这篇《Java 8 有多牛逼?打破一切你对接口的认知!》,帮助许多人解开了疑惑,还有读者留言说两者还有啥区别,故引发了此篇:

在我们面试时也会经常遇到面试官问抽象类和接口的区别是什么,大部人肯定会说:接口中的所有方法都是抽象的,抽象类中的方法除了抽象方法还可以写实现方法,如果你还这样回答那你就 OUT 啦,要跟上形式。

这个问题我在面试一个 39 岁的程序员时,他居然也没回答上来,其实了解 Java 8 的同学应该都知道,Java 8 在接口中推出了默认方法、静态方法,打破了接口只能写抽象方法的传统,如果你还不知道的可以点击阅读我之前发的这篇文章。

既然接口都能写实现方法了,那么还要抽象类干嘛呢?Java 8 中的接口和抽象类到底还有啥区别?大家是不是都有困惑?

所以,栈长这篇带大家分析一下,不一定全,但希望对你有用。

区别1:

首先抽象类是一个“类”,而接口只是一个“接口”,两者的概念和应用场景不一样,这也是抽象类和接口的主要区别。

区别2:

即使在 Java 8 中接口也能写实现方法了,但却不能写构造方法,而在抽象类是可以写构造方法的,意味着抽象类是参与类的实例化过程的,而接口则不是。

区别3:

抽象类可以有自己的各种成员变量,并且可以通过自己的非抽象方法进行改变,而接口中的变量默认全是 public static final 修饰的,意味着都是常量,并且不能被自己和外部修改。

区别4:

接口可以实现多继承,而抽象类只能单继承。

下面我举两个例子:

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {
    ...
}    
public interface Connection  extends Wrapper, AutoCloseable {
...
}

类与类只能单继承,而类与接口、接口与接口可以多继承。

总结

Java 8 中的接口和抽象类的区别除了接口中可以写实现方法之外这点变化,其他的还是保持不变的。

既然接口可以写方法实现了,那么抽象类的存在貌似是弱化了,因为类只能是单继承,耦合性不好,而接口可以多实现,可以灵活扩展,也不会增加类的耦合性。

虽然说是少用继承,多用组合的设计理念,但继承的场景也还是存在的,比如我们常用的模板设计模式就是抽象类和各种模板的子类,所以说,接口也不能完全代替抽象类的。

你认为抽象类的应用场景还有哪些呢?欢迎留言分享!

最后,Java 系列教程还会继续更新,关注Java技术栈公众号第一时间推送,还可以在公众号菜单中获取历史 Java 教程,都是干货。

近期热文推荐:

1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

4.吊打 Tomcat ,Undertow 性能很炸!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

以上是关于java中的枚举到底有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的枚举类型有啥用么?

java中的enum有啥用呢?

java枚举有啥不好

浅谈在Java开发中的枚举的作用和用法

Java中的枚举--Enumeration

C语言的enum中的枚举名有啥用?