|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
|
Почему локальные переменные методов нельзя изменять в анонимных классах?20.03.2016, 23:28. Показов 5512. Ответов 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Почему дизайн решает?
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. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|