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

Local variable xxx defined in an enclosing scope must be final or effectively final

程序员文章站 2022-07-15 11:09:02
...

Local variable xxx defined in an enclosing scope must be final or effectively final

匿名内部类和局部内部类只能引用外部的fianl变量,因为局部变量在初始化后,又对这个变量进行了赋值。赋值后会认为这个变量不是final了,所以报错。把变量变成fianl即可不报错。

但是这样的话我们就不能实现关于最大年龄在排序时做的统计,解决方法很简单,将上面的maxAge换成数组类型存储最大年龄即可。

lambda表达式也有类似问题,其可以访问给它传递的变量,访问自己内部定义的变量,同时也能访问它外部的变量。但lambda表达式访问外部变量有一个非常重要的限制:变量不可变(只是引用不可变,而不是真正的不可变)。

附代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 
 * @author luochenxi
 *
 */
public class Main {

	public static void main(String[] args) {
		
		Person p1 = new Person("aaa",18);
        Person p2 = new Person("bbb",20);
        Person p3 = new Person("ddd",16);
        Person p4 = new Person("ccc",19);
        
        List<Person> list = new ArrayList<Person>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        
        print(list);
        
        int [] maxAge = new int[1];
        
        Collections.sort(list,new Comparator<Person>() {
            @Override
            public int compare(Person p1,Person p2) {
            	int sort = p1.getAge() - p2.getAge();
                if(sort>0) {
                	maxAge[0] = p1.getAge();
                	return 1;
                }else if(sort<0) {
                	maxAge[0] = p2.getAge();
                	return -1;
                }
                maxAge[0] = p1.getAge();
                return 0;
            }
        });
        
        print(list);
        
        System.out.println("最大年龄:" + maxAge[0]);
		
	}

	private static void print(List<Person> list) {
		for (Person person : list) {
			System.out.print(person.getName()+",");
		}
		System.out.println();
	}

}

class Person {
	
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return name + ":" + age;
	}
}