我有一个size
作为参数的构造函数。 Eclipse迫使我声明Integer size
为最终版。为什么?
public LRUCache(final Integer size) {
lhm = Collections.synchronizedMap(new LinkedHashMap<String, Integer>() {
@Override
public boolean removeEldestEntry(Map.Entry eldest) {
return size() > size;
}
});
}
答案 0 :(得分:3)
Eclipse没有强制任何东西。 Java 要求将局部变量声明为 final ,如果它们在匿名内部类中使用的话。这些类会复制使用的任何局部变量,如果变量不是final,则原始和副本可能引用不同的值。
答案 1 :(得分:1)
size
是对Integer
对象的引用。当你这样做
size() > size
您要解除引用size
以获取其int
值。因为removeEldestEntry
发生在不同的上下文中,在不同的时间,需要保证您使用的引用与您声明的引用相同。因此,您需要final
,即。所以参考不能改变。
在the Java Language Specification
中使用了任何局部变量,形式参数或异常参数但是 未在内部类中声明必须声明为final。
每个局部变量(§14.4)和每个空白的最终字段(§4.12.4, §8.3.1.2)在访问时必须具有明确赋值 值发生。
在匿名类声明之前明确赋值 (§15.9.5)在V iff V的范围内声明是绝对的 在声明的类实例创建表达式之后分配 匿名班。