Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Есть ли смысл использовать final в блоке catch |
Автор: Royan 22.10.2008, 14:55 | ||
Задались с коллегами вопроом, а есть ли смысл писать вот так
Cуть в наличии ключевого слова final. Что хотелось бы услышать... аргументированные точки зрения почему в этом смысл есть или почему его нет, но только, пожалуйста, аргументируйте свою позицию |
Автор: LSD 22.10.2008, 15:17 |
А шоб було! ![]() Хотя я себе смутно представляю ситуацию, когда это реально может потребоваться. Конечно для final переменных JIT может провести дополнительную оптимизацию, но в случае с Exception, это как мёртвому припарки. |
Автор: SoulKeeper 22.10.2008, 17:32 | ||
Ну вот приспичит Вам написать код
и без final переменной не обойтись ;) |
Автор: Samotnik 22.10.2008, 17:40 |
SoulKeeper, я чета не понимаю, зачем ? Можеш обьяснить ? ![]() ![]() |
Автор: LSD 22.10.2008, 17:57 |
Запусти компиляцию и компилятор тебе объяснит. |
Автор: Samotnik 22.10.2008, 20:06 |
вот блин, я почему то читал finally а не final ![]() ![]() надо домой ити ![]() |
Автор: HappyCoder 22.10.2008, 20:35 | ||||
Это не миф. Просто новые JVM уже настолько умные, что им необязательно знать, final ли переменная или нет. |
Автор: w1nd 23.10.2008, 13:07 | ||||
Отношение, конечно, верное - с каждой версией они всё умнее и умнее. Но насчёт настолько-умности-уже-сейчас - к сожалению, миф. GC далеко не всегда соображает, когда можно удалить объект - обнуление локальной ссылки перед выходом из метода ему сильно помогает. JIT создаёт неоптимальный код - элементарные оптимизации арифметических операций не выполняются. Качество оптимизации на этапе компиляции ниже плинтуса - в нижеследующем примере с автобоксингом всё очень и очень печально. Наконец, никто не отменял рефлексию ![]()
А пользительность модификатора final для параметров и локальных переменных (сюда же относятся исключения, декларированные в catch) - это действительно МИФ. Правда в том, что при использовании достаточно умного (!) компилятора этот модификатор не повредит (!) результату. Для каждого final-параметра в соответствующем классе будет зарезервировано финальное поле со всеми втекающими и вытекающими. Добавлено через 1 минуту и 52 секунды Кстати, ещё капля дёгтя - не удаляется мёртвый код. Добавлено через 5 минут и 1 секунду Да, собственно, главную мысль не сформулировал: модификатор final для методов, полей и параметров и локальных переменных - это, считайте, разные модификаторы ![]() |
Автор: Platon 24.10.2008, 11:48 | ||
а я замечал, что простейшие ветки отсекает:
Не декомпилировал, но то, что строки "debug mode only" в байткоде не было косвено указывает на отсечение этой ветки. |
Автор: w1nd 24.10.2008, 15:12 |
Да, это единственное, что оно умеет отсекать. |
Автор: Royan 27.10.2008, 13:29 | ||
Исходя из всего вышесказанного напрашивается такой вывод. Было бы здорово в будущих версиях java видеть все локальные переменные (в т.ч. параметры методов) константами по умолчанию, а те из них, что должны изменяться следует помечать как переменные, например, вот так:
С одной стороны это изменение позволило бы избежать некоторого процента локальных багов, а с другой, разумеется, стало бы причиной несовместимости порядочного количества старого кода. |
Автор: Platon 27.10.2008, 14:02 | ||
что-то не напрашивается.
нет, здорово бы не было. |
Автор: LSD 27.10.2008, 14:14 | ||
Жесть. |
Автор: Royan 28.10.2008, 02:01 |
Platon, LSD, Хорошо почему нет? |
Автор: Keyo 28.10.2008, 11:00 |
Вот почитайте, интересная статья, кое что и про final есть http://blogs.sun.com/vmrobot/entry/%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8_java Согласен с LSD, особого смысла делать в блоке try/catch, final Exception особого смысла нет... и вообще Platon прав, мне кажется что это прежде всего средство для обеспечения большей прозрачности кода А вот еще интересная статья, почти в тему... http://www.ibm.com/developerworks/ru/library/j-jtp1029/index.html |
Автор: w1nd 29.10.2008, 12:48 |
Такое ощущение возникает, что люди не воспринимают того, к чему не готовы. Русским языком написал, что final для локальных переменных и параметров - это мало что вообще не про константы, так ещё и имеет непосредственное влияние на генерируемый код, а не на какую-то там прозрачность чего-то... нет, не понимают ![]() |
Автор: Keyo 30.10.2008, 10:06 |
w1nd, да вы правы, преклоняю пред вами колени, великий гуру и да не коснется гнев ваш меня |
Автор: w1nd 30.10.2008, 12:51 | ||
Усерднее, усерднее бейте челом, а то треска не слышно ![]() |
Автор: SuperFly 1.11.2008, 12:35 | ||
А что насчет обнуления перекрестных ссылок? К примеру, окно закрываем, и надо бы всю рудиментную сеть взаимосвязанных объектов. Как это оформить? сделать метод подчистки, который обнуляет ссылки и вызывает подобные методы подчистки подчиненных объектов? |
Автор: w1nd 1.11.2008, 13:18 | ||
Я так и делал. Очень помогало. |
Автор: SuperFly 1.11.2008, 13:43 |
Почему в прошедшем времени? Теперь не делаете? |
Автор: w1nd 1.11.2008, 17:29 |
Нет, просто не всегда в этом есть нужда. Делал так в одном гуёвом приложении, там были чудовищно сложные компоненты, много взаимосвязей. |
Автор: Royan 5.11.2008, 11:45 | ||
Хотелось бы понять как вы это проверяли? То есть это был тест (если тест то какой) или просто наблюдение на сложном GUI? |
Автор: w1nd 6.11.2008, 13:03 | ||
Глядя на показания Windows Task Manager. SUN JVM в клиентском режиме сразу же высвобождает память, занятую чем-то гарантированно недостижимым. И это был специальный тест. Поясню - память в любом случае освобождается или используется повторно, но если не обнулять ссылки явно, это действо откладывается сборщиком "на потом". Тест очень простой - создаём большой массив чего-нибудь в обработчике нажатия на кнопочку и либо обнуляем перед выходом из него, либо не обнуляем. |
Автор: Keyo 6.11.2008, 13:44 |
хм, интересно. а как это оформить? просто тупо в конце каждого метода обнулять ссылки? |
Автор: w1nd 6.11.2008, 15:56 |
Можно в местах, где возможно вызывать какой-нить dispose, чистить ссылки на объекты, которые точно не понадобятся. Можно вообще ничего не делать - рано или поздно реализуют JVM, в которой будет суперумный сборщик мусора, которому не понадобятся подсказки... ![]() |