java 不可变对象 final Collections guava 简单样例

本文介绍了Java中如何使用final、Collections和Guava创建不可变对象。讲解了final修饰引用类型的特性,并提供了代码示例,展示了构建不可变List、Map和Set的方法。
摘要由CSDN通过智能技术生成

本地环境

  • jdk1.8

连接

说明

java的final关键字大家都了解,但是final修饰的如果是引用类型,那么不可修改的其实只是重新赋值,是可以修改引用对象中的属性值的。
那如何来构建一个不可修改的list、map、set等这些对象呢,可以通过jdk自带的Collections,也可以通过google的guava来进行构建。

代码样例

import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import lombok.extern.slf4j.Slf4j;

/**
 *         <dependency>
 *             <groupId>org.projectlombok</groupId>
 *             <artifactId>lombok</artifactId>
 *             <version>1.18.8</version>
 *         </dependency>
 *
 *         <dependency>
 *             <groupId>com.google.guava</groupId>
 *             <artifactId>guava</artifactId>
 *             <version>23.0</version>
 *         </dependency>
 */
@Slf4j
public final class UnModify {

    // 初始化一个 final 修饰的list
    private static final List finalList = new ArrayList();
    // 初始化一个由 Collections 构建的list
    private static List collectionsList = new ArrayList();
    // 初始化一个由 guava 构建的list
    private static final List immutableList = ImmutableList.of(1, 2, 3);

    static {
        finalList.add(1);
        finalList.add(2);
        finalList.add(3);

        collectionsList.add(1);
        collectionsList.add(2);
        collectionsList.add(3);
        collectionsList = Collections.unmodifiableList(collectionsList);
    }

    public static void main(String[] args){

        log.info(finalList.toString());
        finalList.set(0, 4);
        log.info(finalList.toString());

        /*
        Exception in thread "main" java.lang.UnsupportedOperationException
        at java.util.Collections$UnmodifiableList.set(Collections.java:1311)
         */
        log.info(collectionsList.toString());
        collectionsList.set(0, 5);
        log.info(collectionsList.toString());

        /*
        Exception in thread "main" java.lang.UnsupportedOperationException
        at com.google.common.collect.ImmutableList.set(ImmutableList.java:512)
         */
        log.info(immutableList.toString());
        immutableList.set(0, 6);
        log.info(immutableList.toString());

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值