|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
|
Почему локальные переменные методов нельзя изменять в анонимных классах?20.03.2016, 23:28. Показов 5514. Ответов 26
Метки нет (Все метки)
Почему Java защищает от изменения локальные переменные методов, когда пытаешься их изменить в анонимном внутреннем классе? Она требует, чтобы они были финальными. То же самое с лямбда - выражениями. Я гуглил этот вопрос, но что-то как-то не совсем понял
0
|
|
| 20.03.2016, 23:28 | |
|
Ответы с готовыми решениями:
26
Почему в некоторых классах нет встроенных методов BindingList'a Почему в switch нельзя определять переменные?
|
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
| 21.03.2016, 09:37 | |
|
danek130995, насколько я знаю, если эти переменные не будут финальными, они умрут после завершения метода и когда сработает ваш метод анонимного класса, их уже не будет.
1
|
|
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
|
| 21.03.2016, 11:06 [ТС] | |
|
KEKCoGEN, а почему они умирают? Ведь анонимный класс находится внутри метода
0
|
|
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|
| 21.03.2016, 21:21 | |
|
Переменная. Переменная перестанет существовать после выхода из функции.
Компилятор подставит на момент создания анонимного класса значение из переменной функции. А присвоение окажется "в никуда".
1
|
|
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
|
| 21.03.2016, 21:45 [ТС] | |
|
lemegeton, не понял. Вы имеете ввиду, что когда создаётся анонимный класс, производится выход из метода? И перестают существовать локальные переменные? А почему же тогда финальные не перестают существовать? Под функцией Вы имеете ввиду метод? А если анонимный класс создаётся не в конце метода? После его выполнения они опять начинают существовать? Я не совсем понимаю, не могли бы вы пожалуйста объяснить подробнее
0
|
|
|
|
||||||
| 21.03.2016, 23:11 | ||||||
Сообщение было отмечено danek130995 как решение
Решение
Представим, что было бы разрешено.
Во-вторых, если бы такое было бы разрешено (как в C# например), то это обязало бы компилятор, генерировать дополнительный класс-обёртку, чтобы при изменение переменной, анонимный класс видел бы эти изменения. А это дополнительный overhead.
1
|
||||||
|
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
|
||||
| 22.03.2016, 08:06 | ||||
|
Добавлено через 4 минуты BTW, если не ошибаюсь, в Java 9 эту возможность собираются реализовать.
1
|
||||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||||||||||||||||||||
| 22.03.2016, 11:04 | |||||||||||||||||||||
Сообщение было отмечено danek130995 как решение
Решение
Поясню мысль примером.
Вот от чего защищается компилятор:
А возвращаемое замыкание будет выполнено лишь после этого прискорбного факта. И чему тогда присваивать? Приблизительный аналог из С++ это возвращения ссылки на локальную переменную. Да, гораздо чаще нам нужно выполнить функцию в том же контексте:
Обходить коряво -- созданием массива из одного элемента и работой с ним.
1
|
|||||||||||||||||||||
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
||
| 22.03.2016, 19:12 [ТС] | ||
|
lemegeton, turbanoff что такое здесь замыкание? Почему Вы употребляете это слово?
Добавлено через 5 минут lemegeton,
0
|
||
|
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
|
|
| 22.03.2016, 20:49 | |
|
1
|
|
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||||||
| 22.03.2016, 22:54 | |||||||
|
Внутри функций переменные создаются на стеке. А объекты -- в куче. Переменные исчезают, а объекты -- не сразу. Сборщик мусора их соберёт, когда посчитает нужным. Если на них ссылок не будет. А тут будет ссылка -- внутри замыкания. Объект не исчезнет.
1
|
|||||||
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
|
| 22.03.2016, 23:23 [ТС] | |
|
lemegeton, да, но если X исчезнет, как же мы обращаемся к X[0]? Понятно, что объект жив, но к нему идёт обращение по ссылке через X, но ведь его не будет же?
Добавлено через 2 минуты korvin_, написано, что Википедия не имеет статьи для closure. Я слышал про closure на одном из предметов, там это было показано на примере конечного автомата для множества состояний. А тут как бы его увидеть? Что вы имеете ввиду под closure в java?
0
|
|
|
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|
| 22.03.2016, 23:29 | |
|
0
|
|
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
|
| 23.03.2016, 11:21 [ТС] | |
|
КОП, уже заработало)
Добавлено через 12 минут lemegeton, Вы имеете ввиду, что если x объявлен так: int x, то он исчезнет, а если так int x[] = {0}, то объект будет доступен по ссылке x[0]?
0
|
|
|
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
|
|
| 23.03.2016, 20:34 | |
|
1
|
|
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|
| 23.03.2016, 22:51 | |
|
Различайте переменную и объект.
Переменная создается на стеке и исчезает по выходу из функции. Объект создается в общей памяти и исчезает только когда сборщик мусора так решит. Допустим, внутри функции есть объявление: Object s = new Object(); s -- переменная -- исчезнет, а объект, созданный new Object() удалится только тогда, когда на него пропадут все ссылки.
1
|
|
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
||
| 24.03.2016, 18:59 [ТС] | ||
|
lemegeton, да, это понятно, но, если s(переменная,ссылка) - исчезнет, тогда исчезнет и объект? Я это к тому, что
0
|
||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|
| 24.03.2016, 20:08 | |
|
Значение переменной будет скопировано компилятором на момент обращения.
1
|
|
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
|
| 24.03.2016, 21:38 [ТС] | |
|
lemegeton,оно будет скопировано в анонимный класс?
0
|
|
| 24.03.2016, 21:38 | |
|
Помогаю со студенческими работами здесь
20
Почему нельзя подставлять переменные в выражения #if #else? Использование анонимных методов Почему нельзя использовать в операторе case переменные, которые определены как #define Дебаггинг анонимных методов и лямбда-выражений Использование анонимных методов внутри цикла foreach Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|