关于内部类引用外部变量的一些注意事项

内部类变量的生命周期

匿名内部类的生命周期为整个方法,而内部类引用的外部变量的生命周期可能在内部类方法还未结束的时候就已经被销毁了。所以匿名内部类引用的外部变量默认由关键字final修饰。在Java8之后出现了Effectively final,意思就是,假如这个局部变量我们在使用过程中都不会出现改变引用的情况,那么我们不需要加final,默认是final。

    @Test
    public void test2(){

        /*final 可加可不加*/ List<String> listFinal = new ArrayList<>();
        List<String> listLocal= new ArrayList<>(Arrays.asList("hello", "world", "java"));
        listLocal.stream().forEach(item -> {
            listFinal.add(item);
        });
        
        /*
        * 会出现报错,将null赋值给listFinal,
        * 会把listFinal的引用值改变,不符合final的定义
        * */
        //listFinal = null;
    }

内部类创建新的对象

解释都写在了代码里面的注释里面了。

package pers.luoyanze.datasource.springjdbc;

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import pers.luoyanze.datasource.druid.JDBCUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class JDBCTemplateDemo02 {
    
    @Test
    public void test() {
    	/*
        * 这是我在学习jdbc时候写的代码。
        * 没有太多时间,就没有重写测试代码了。
        * */
        JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
        List<Map<String, Object>> mapList = template.queryForList("select * from job;");
        ArrayList<Job> jobList = new ArrayList<>();

        Job[] job = new Job[1];
        //Job job = null;
        mapList.stream().forEach((mapMember)->{
            int id = (int)mapMember.get("id");
            String name = (String)mapMember.get("jname");
            String desc = (String)mapMember.get("description");
            /*
            * 如果创建的是job对象而不是数组,在内部类里面重新new Job(id, name, desc)
            * 将会修改job对象的引用值,从而违背了final关键字的规则。
            * 如果创建一个size为1的job数组,当我们在内部类里面修改job[0]的引用,
            * 使0号索引指向一个新的job对象,这样可以不影响job的引用。
            * */
            //job = new Job(id, name, desc);
            //jobList.add(job);
            job[0] = new Job(id, name, desc);
            jobList.add(job[0]);
        });
        jobList.stream().forEach(System.out::println);

    }
}

Job 类代码

package pers.luoyanze.datasource.springjdbc;

import java.util.Map;

public class Job {
    private int id;
    private String jname;
    private String description;

    public Job(int id, String jname, String description) {
        this.id = id;
        this.jname = jname;
        this.description = description;
    }

    public Job() {
    }


    @Override
    public String toString() {
        return "Job{" +
                "id=" + id +
                ", jname='" + jname + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
    
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值