枚举使用、转数组、实现接口、枚举单例

简介: 枚举使用、转数组、实现接口、枚举单例

枚举实现接口与values方法


  • 我们定义常量都是: public static final… 。
  • 现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法
  • 友情提示:values(), 为什么说特殊呢,因为在Enum 的 API 文档中也找不到这个方法,此方法可以将枚举类转变为一个枚举类型的数组,因为枚举中没有下标,我们没有办法通过下标来快速找到需要的枚举类,这时候,转变为数组之后,我们就可以通过数组的下标,来找到我们需要的枚举类
  • 那么这是为什么呢:通过查阅网上资料得知,Java编译器会自动在enum类型中插入一些方法,其中就包括values()——所以我们的程序在没编译的时候,自然没法查看values()方法的源码了

1.基本用法

枚举的用法比较多,本文主要旨在介绍利用枚举实现单例模式的原理,所以这里也主要介绍一些相关的基础内容。

首先,枚举类似类,一个枚举可以拥有成员变量,成员方法,构造方法。先来看枚举最基本的用法:

enum Type{
    A,B,C,D;
}

创建enum时,编译器会自动为我们生成一个继承自java.lang.Enum的类,我们上面的enum可以简单看作:


class Type extends Enum{
    public static final Type A;
    public static final Type B;
    ...
}

对于上面的例子,我们可以把Type看作一个类,而把A,B,C,D看作类的Type的实例。

当然,这个构建实例的过程不是我们做的,一个enum的构造方法限制是private的,也就是不允许我们调用。

2.枚举switch的使用

public class Test {
  private static Color RED;
public static void main(String[] args) {
              Color inColor = Color.RED;//inColor为本次传入的参数
          Test.showColor(inColor);
  }
/**
 * @desc  展示枚举定义的颜色
 * @param c
 */
  public static void showColor(Color c)
  {
        switch (c) { 
        case RED: 
          System.out.println("红色"); 
          break; 
        case GREEN: 
          System.out.println("绿色"); 
          break; 
        case YELLOW: 
          System.out.println("黄色"); 
          break; 
        default: 
          break; 
        } 
  }

3.枚举实现接口

//接口
package com.Li.Enum;
/**
 * 
 * @Description:  枚举实现接口
 * @auther:Li Ya Hui
 * @Time:2021年4月17日上午9:14:04
 */
public interface Interfaces {
  public void print();//接口方法   输出 
}
//枚举

枚举实现单例模式


有了上面的基础,我们可以来看一下枚举单例的实现方法:

class Resource{
}
public enum SomeThing {
    INSTANCE;
    private Resource instance;
    SomeThing() {
        instance = new Resource();
    }
    public Resource getInstance() {
        return instance;
    }
}

上面的类Resource是我们要应用单例模式的资源,具体可以表现为网络连接,数据库连接,线程池等等。

获取资源的方式很简单,只要 SomeThing.INSTANCE.getInstance() 即可获得所要实例。下面我们来看看单例是如何被保证的:

首先,在枚举中我们明确了构造方法限制为私有,在我们访问枚举实例时会执行构造方法,同时每个枚举实例都是static final类型的,也就表明只能被实例化一次。在调用构造方法时,我们的单例被实例化。

也就是说,因为enum中的实例被保证只会被实例化一次,所以我们的INSTANCE也被保证实例化一次。

可以看到,枚举实现单例还是比较简单的,除此之外我们再来看一下Enum这个类的声明:

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable
  • 可以看到,枚举也提供了序列化机制。某些情况,比如我们要通过网络传输一个数据库连接的句柄,会提供很多帮助。

单元素的枚举类型已经成为实现Singleton的最佳方法。

总结


  • 构造方法只能是私有的,那是因为枚举的常量都是在定义的时候创建的,如果构造方法公开,枚举就没有意义了
  • 接口的方法必须实现自枚举类的定义中,抽象方法是现在了常量的定义中
  • switch 友好的支持了枚举类型
  • 枚举可以让我们实现更加高效、简单、安全的单例
目录
相关文章
|
6月前
|
开发框架 Java 编译器
Java反射,枚举讲解
Java反射,枚举讲解
74 0
|
6月前
|
XML 并行计算 Java
反射、枚举和lambda表达式
反射、枚举和lambda表达式
|
5月前
详细解读COM中集合和枚举器笔记(2)枚举器内部实现
详细解读COM中集合和枚举器笔记(2)枚举器内部实现
21 0
|
6月前
|
XML 安全 Java
反射&&枚举
反射&&枚举
36 0
|
Java 编译器 C++
常量接口 vs 常量类 vs 枚举区别
把常量定义在接口里与类里都能通过编译,那2者到底有什么区别呢?
69 0
|
设计模式 JSON Java
枚举类——用好枚举真的没有那么简单!
枚举类——用好枚举真的没有那么简单!
100 0
|
自然语言处理 安全 Java
枚举常用方法总结
枚举常用方法总结
82 0
|
安全 Java 编译器
反射与枚举
本篇文章主要介绍Java语法中的反射与枚举部分。
115 0
反射与枚举
|
存储 JavaScript 前端开发
枚举(enumerables)
枚举(enumerables)
123 0
|
安全 Java 编译器
今天我们来聊聊单例模式和枚举
今天我们来聊聊单例模式和枚举
今天我们来聊聊单例模式和枚举