在日常开发中,通过定义枚举类型可以用来表示常量,通过枚举类型,可以把相关的常量放置到一起。
enum RedisConfig1 {
//枚举量1
ENUM1,
//枚举量2
ENUM2,
//枚举量3
ENUM3;
}
通过自定义构造方法,自定义包含指定的单个或者多个常量的枚举量。
enum RedisConfig2 {
//枚举量1
ENUM1(100),
//枚举量2
ENUM2(200),
//枚举量3
ENUM3(300);
private int id;
private RedisConfig2(int i){
this.id = i;
}
}
通过覆盖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);
}
}
通过自定义方法获取枚举量中的常量值
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
在日常开发中,如果有使用到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;
}
}
例如,在实际开发中,我们可能需要在不通过情况下构建不同的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行
}
}