欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-10 12:30:16
内部类变量的生命周期匿名内部类的生命周期为整个方法,而局部变量的生命周期却不一定是整个方法。所以匿名内部类引用的局部变量默认由关键字final修饰。在Java8之后出现了Effectively final,意思就是,假如这个局部变量我们在使用过程中都不会出现改变引用的情况,那么我们不需要加final,默认是final。 @Test public void test2(){ /*final 可加可不加*/ List listFinal = ne...

内部类变量的生命周期

匿名内部类的生命周期为整个方法,而局部变量的生命周期却不一定是整个方法。所以匿名内部类引用的外部变量默认由关键字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 + '\'' +
                '}';
    }
    
}

本文地址:https://blog.csdn.net/m0_43445777/article/details/107369863