Local variable xxx defined in an enclosing scope must be final or effectively final
程序员文章站
2022-07-15 11:09:02
...
匿名内部类和局部内部类只能引用外部的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;
}
}