java 枚举enum(一)——enum的基本使用

1 常量表示

在日常开发中,通过定义枚举类型可以用来表示常量,通过枚举类型,可以把相关的常量放置到一起。

enum RedisConfig1 {
    //枚举量1
    ENUM1,
    //枚举量2
    ENUM2,
    //枚举量3
    ENUM3;
}

2 自定义枚举类型

2.1 自定义构造方法

通过自定义构造方法,自定义包含指定的单个或者多个常量的枚举量。

enum RedisConfig2 {
    //枚举量1
    ENUM1(100),
    //枚举量2
    ENUM2(200),
    //枚举量3
    ENUM3(300);
    private int id;
    private RedisConfig2(int i){
        this.id = i;
    }
}

2.2 覆盖toString

通过覆盖toString方法重写枚举量的输出方法

enum RedisConfig3 {
    //枚举量1
    ENUM1(100),
    //枚举量2
    ENUM2(200),
    //枚举量3
    ENUM3(300);
    private int id;
    private RedisConfig3(int i){
        this.id = i;
    }

    @Override
    public String toString() {
        return String.valueOf(id);
    }
}

2.3 自定义方法

通过自定义方法获取枚举量中的常量值

enum RedisConfig4 {
    //枚举量1
    ENUM1(100),
    //枚举量2
    ENUM2(200),
    //枚举量3
    ENUM3(300);
    private int id;
    private RedisConfig4(int i){
        this.id = i;
    }

    public int getId() {
        return id;
    }

    @Override
    public String toString() {
        return String.valueOf(id);
    }
}

我们统一测试上述四种情况定义量的输出如下单元测试代码

@Test
public void test(){
    System.out.println(RedisConfig1.ENUM1);
    System.out.println(RedisConfig2.ENUM1);
    System.out.println(RedisConfig3.ENUM1);
    System.out.println(RedisConfig4.ENUM1.getId());
}

输出结果如下:

ENUM1
ENUM1
100
100

3 switch与enum结合使用

在日常开发中,如果有使用到switch的情况,通过结合enum共同使用会使得代码的可阅读性更强,例如如下代码。

public static RedisClusterClient getInstance(RedisConfig config) {
        switch (config){
            case redis1: return RedisCluster1.RCC;
            case redis2: return RedisCluster2.RCC;
            case redis3: return RedisCluster3.RCC;
            default: return null;
        }
    }

4 使用enum构建单例工厂

例如,在实际开发中,我们可能需要在不通过情况下构建不同的Redis链接,为了在分布式情况下使用redis我们通常定义为单例模式,同时在使用Redis客户端连接的时候我们尽可能的不需要关注连接的创建过程,只需要关注使用哪一个Redis,这个时候我们通过使用enum创建一个单例工厂,来完成这个功能。

enum RedisConfig {

    //redis1
    Redis1(111, "password1"),
    //redis2
    Redis2(222,"password2"),
    //redis3
    Redis3(333, "password3");


    private int id;
    private String address;
    private String password;
    private String urlFormat = "https://test_url,uid=%d";

    RedisConfig(int id, String password) {
        this.id = id;
        this.address = String.format(urlFormat, id);
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public String getAddress() {
        return address;
    }

    public String getPassword() {
        return password;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setAddress(String url) {
        this.address = url;
    }

}

public class RedisClientFactory {

    public static RedisClusterClient getInstance(RedisConfig config) {
        switch (config){
            case Redis1: return RedisCluster1.RCC;
            case Redis2: return RedisCluster2.RCC;
            case Redis3: return RedisCluster3.RCC;
            default: return null;
        }
    }

    private static class RedisCluster1 {
        private static final String ADDRESS = redis1.getAddress();
        private static final String PASSWORD = redis1.getPassword();
        private static final RedisClusterClient RCC = getRedisClusterClient(ADDRESS, PASSWORD);
    }

    private static class RedisCluster2 {
        private static final String ADDRESS = redis2.getAddress();
        private static final String PASSWORD = redis2.getPassword();
        private static final RedisClusterClient RCC = getRedisClusterClient(ADDRESS, PASSWORD);
    }

    private static class RedisCluster3 {
        private static final String ADDRESS = reids3.getAddress();
        private static final String PASSWORD = redis3.getPassword();
        private static final RedisClusterClient RCC = getRedisClusterClient(ADDRESS, PASSWORD);
    }

    private static RedisClusterClient getRedisClusterClient(String url, String password){
        //此处省略1000行
    }
}
发布了15 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/redhatforyou/article/details/90315936