0

我有一个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;
            }
        });
    }
4

2 回答 2

3

Eclipse 并没有强迫任何事情。如果在匿名内部类中使用局部变量, Java要求将它们声明为final 。这些类复制任何使用的局部变量,如果变量不是最终的,则原始和副本可能引用不同的值。

于 2013-10-12T03:34:06.947 回答
1

size是对Integer对象的引用。当你这样做

size() > size

您正在取消引用size以获取其int价值。因为removeEldestEntry发生在不同的上下文、不同的时间,所以需要保证您使用的引用与您声明的引用相同。因此你需要final,即。所以参考不能改变。

Java 语言规范中

任何使用但未在内部类中声明的局部变量、形参或异常参数都必须声明为 final。

每个局部变量(第 14.4 节)和每个空白最终字段(第 4.12.4 节、第 8.3.1.2 节)在对其值进行任何访问时都必须具有明确分配的值。

V 肯定在 V 范围内声明的匿名类声明(第 15.9.5 节)之前分配,当且仅当 V 肯定在声明匿名类的类实例创建表达式之后分配。

于 2013-10-12T03:35:00.177 回答