为什么eclipse强迫我使用决赛?

时间:2013-10-12 03:32:29

标签: java constructor final

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

size() > size

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

the Java Language Specification

  

使用了任何局部变量,形式参数或异常参数但是   未在内部类中声明必须声明为final。

and

  

每个局部变量(§14.4)和每个空白的最终字段(§4.12.4,   §8.3.1.2)在访问时必须具有明确赋值   值发生。

and

  

在匿名类声明之前明确赋值   (§15.9.5)在V iff V的范围内声明是绝对的   在声明的类实例创建表达式之后分配   匿名班。