2014-10-24 2 views
2
TIntArrayList list = new TIntArrayList(); 
final TIntArrayList tempList = new TIntArrayList(); 
list.add(10086); 
list.add(12345); 
list.add(1989); 
list.forEach(new TIntProcedure() { 
    @Override 
    public boolean execute(int i) { 
     if (i > 10086) { 
      tempList.add(i); 
     } 
     return true; 
    } 
}); 

Я использую intellij, и он предлагает мне объявить tempList окончательным, почему tempList должен быть объявлен окончательным?Почему список должен быть объявлен окончательным

+0

Ну, просто потому, что язык требует этого. Я думаю, что это потому, что (оригинальные) авторы языка сделали ошибку - окончательное здесь на самом деле мало что значит, кроме как напоминать вам ссылку со стороны внутреннего класса. Но вы должны использовать final или внутренний класс не может использовать ссылку. – markspace

+0

Начиная с Java 8, он фактически не должен быть объявлен окончательным, хотя он должен быть «эффективным» окончательным. –

+0

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html – etherous

ответ

1

Это связано с тем, как работает виртуальная машина.

Во-первых, чтобы понять это, вы должны знать, что внутренний стек и стек кадры (внутри виртуальной машины)

Локальные переменные (как примитивы и ссылки), хранящиеся в кадре стека метода и не являются доступными другими методами.

В вашем случае локальная переменная tempList недоступна по методу boolean execute(int i), поскольку она «принадлежит» к прилагаемому методу («живет» в локальном стеке стека).

Но для того, чтобы сделать его доступным, вы объявляете переменную final, таким образом она внутренне помещается «снаружи» метода, например, если она является частной переменной экземпляра, так что к ней можно получить доступ с помощью execute() и других методы.

2

Сфера применения «tempList» находится в пределах метода. Когда метод завершится, «tempList» в конечном итоге будет потерян. Однако анонимный класс, который вы написали, все еще может находиться в куче, и на него можно ссылаться позже. Сделав его окончательным, убедитесь, что анонимный класс по-прежнему будет вести себя так, как ожидалось.

Смежные вопросы