Java 自定义集合常量

该文章已生成可运行项目,

Java 自定义集合常量

一、普通方法自定义集合常量信息

1、定义 Map 集合信息

(1)方法一:使用静态代码块
public static final Map CONSTANT_MAP_1 = new HashMap();

static {
        CONSTANT_MAP_1.put("01", "同意");
        CONSTANT_MAP_1.put("02", "不同意");
        CONSTANT_MAP_1.put("03", "待定");
    }

测试:

Set<String> keys1 = Constants.CONSTANT_MAP_1.keySet();
for (String key : keys1) {
    System.out.println("常量 Map 的 key:" + key + " ,值是:" + Constants.CONSTANT_MAP_1.get(key));
 }        

打印结果:
在这里插入图片描述

(2)方法二:简单定义 Map 常量
public static final Map<String, String> CONSTANT_MAP_2 = new HashMap<String, String>() {
        {
            put("A", "父母");
            put("B", "姑侄");
            put("C", "爷孙");
        }
    };

测试:

Set<String> keys2 = Constants.CONSTANT_MAP_2.keySet();
        for (String key : keys2) {
            System.out.println("常量 Map 的 key:" + key + " ,值是:" + Constants.CONSTANT_MAP_2.get(key));
        }

打印结果:
在这里插入图片描述

2、定义 List 集合信息

public static final List<String> CONSTANT_LIST_1 = Arrays.asList("01", "02", "03");

测试:

String relationType = "01";
if (Constants.CONSTANT_LIST_1.contains(relationType)){
            System.out.println("集合包含 relationType:"+relationType);
	}       

打印结果:
在这里插入图片描述

3、定义 Set 集合信息

public static final Set<Integer> CONSTANT_SET_1 = new HashSet<>(Arrays.asList(1,2,3));

测试:

		Integer num = 1;
        if (Constants.CONSTANT_SET_1.contains(num)){
            System.out.println("集合包含数字:"+num);
        }

打印结果:
在这里插入图片描述
需要注意的是:

普通的集合对象(如ArrayList、HashMap、HashSet等)都是可变集合对象,即便是定义为静态常量,也可以通过操作方法进行修改。所以,上面方法定义的集合常量,并不是真正意义上的集合常量。

比如,Arrays.asList 方法生成的 ArrayList 不能执行 add/remove/clear方法,但是可以执行 set 方法,也属于可变集合对象。
在上面的定义 List 集合信息时,定义了集合常量 CONSTANT_LIST_1

public static final List<String> CONSTANT_LIST_1 = Arrays.asList("01", "02", "03");

但是在使用时,可以通过 set 方法去改变集合的值,如下:

 		Constants.CONSTANT_LIST_1.set(0,"09"); // 通过 set 方法修改集合下标是 0 的值
        if (Constants.CONSTANT_LIST_1.contains("01")){
            System.out.println("集合值没被改变");
        }else {
            System.out.println("集合值被改变");
        }

打印结果:
在这里插入图片描述
由打印结果可知,集合的值已经被改变了。为了避免这种情况发生,在JDK中,Collections 工具类中提供一套方法,用于把可变集合对象变为不可变 (不可修改,修改时会抛出 UnsupportedOperationException 异常)集合对象。所以,可以利用这套方法定义集合静态常量。

二、通过 Collections 定义集合常量

	// 定义 List 集合常量
 	public static final List<String> CONSTANT_LIST_2 = Collections.unmodifiableList(Arrays.asList("01", "02", "03"));

	// 定义 Set 集合常量
    public static final Set<Integer> CONSTANT_SET_2 = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(1, 2, 3)));
	
	// 定义 Map 集合常量
    public static final Map<String, String> CONSTANT_MAP_3;

    static {
        CONSTANT_MAP_3 = Collections.unmodifiableMap(new HashMap<String, String>() {{
            put("01", "同意");
            put("02", "不同意");
        }});
    }

以 List 为例测试:

		Constants.CONSTANT_LIST_2.set(0,"09");
        if (Constants.CONSTANT_LIST_2.contains("01")){
            System.out.println("集合值没被改变");
        }else {
            System.out.println("集合值被改变");
        }

打印结果:
在这里插入图片描述

三、拓展:定义数组常量的最佳方式

一般情况下,定义数组常量如下:

public static final int[] CONSTANT_ARRAY = new int[]{1,2,3};

但是,可以通过下标修改数组值,导致数组常量的值可变。所以,这种方法定义的数组常量,并不是一个真正意义上的数组常量。最佳法 “私有数组常量+公有克隆方法” 的解决方案。

如下代码所示:先定义一个私有数组常量,保证不会被外部类使用;在定义一个获取数组常量方法,并返回一个数组常量的克隆值。

	private static final int[] CONSTANT_ARRAY_2 = new int[]{1, 2, 3};
	
	//由于每次返回的是一个克隆数组,即便修改了克隆数组的常量值,也不会导致原始数组常量值的修改。
    public static int[] getConstantArray() {
        return CONSTANT_ARRAY_2.clone();
    }
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YD_1989

分享不易,非常感谢您的鼓励支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值