Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть ли смысл использовать final в блоке catch 
:(
    Опции темы
Royan
Дата 22.10.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Задались с коллегами вопроом, а есть ли смысл писать вот так

Код

try {
  // code
} catch (final XxxxException e) {
  // do exception handling
}


Cуть в наличии ключевого слова final. Что хотелось бы услышать... аргументированные точки зрения почему в этом смысл есть или почему его нет, но только, пожалуйста, аргументируйте свою позицию


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
LSD
Дата 22.10.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



А шоб було! smile 

Хотя я себе смутно представляю ситуацию, когда это реально может потребоваться. Конечно для final переменных JIT может провести дополнительную оптимизацию, но в случае с Exception, это как мёртвому припарки.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
SoulKeeper
Дата 22.10.2008, 17:32 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Ну вот приспичит Вам написать код

Код

...
}catch(Exception e){
new Thread(new Runnable(){

public void run(){
//do something with exception
}

});
}


и без final переменной не обойтись ;)

Это сообщение отредактировал(а) SoulKeeper - 22.10.2008, 17:32
PM MAIL   Вверх
Samotnik
Дата 22.10.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



SoulKeeper,  я чета  не понимаю, зачем ?  
Можеш обьяснить ?  smile   Пажааалста  smile 
PM MAIL   Вверх
LSD
Дата 22.10.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Samotnik @  22.10.2008,  18:40 Найти цитируемый пост)
Можеш обьяснить ?

Запусти компиляцию и компилятор тебе объяснит.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Platon
Дата 22.10.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(LSD @  22.10.2008,  16:17 Найти цитируемый пост)
Конечно для final переменных JIT может провести дополнительную оптимизацию

А я читал, что это миф. final дает только возможность, приведенную SoulKeeper и просто, чтоб в процессе написания кода случайно не переопределить переменную.
PM MAIL ICQ   Вверх
Samotnik
Дата 22.10.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



вот блин, я почему то читал  finally  а  не final  smile  smile 
надо домой ити  smile 
PM MAIL   Вверх
HappyCoder
Дата 22.10.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



Цитата(Platon @ 22.10.2008,  20:02)
Цитата(LSD @  22.10.2008,  16:17 Найти цитируемый пост)
Конечно для final переменных JIT может провести дополнительную оптимизацию

А я читал, что это миф. final дает только возможность, приведенную SoulKeeper и просто, чтоб в процессе написания кода случайно не переопределить переменную.

Это не миф. Просто новые JVM уже настолько умные, что им необязательно знать, final ли переменная или нет.
PM MAIL   Вверх
w1nd
Дата 23.10.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(HappyCoder @  22.10.2008,  20:35 Найти цитируемый пост)
Просто новые JVM уже настолько умные, что им необязательно знать, final ли переменная или нет.

Отношение, конечно, верное - с каждой версией они всё умнее и умнее. Но насчёт настолько-умности-уже-сейчас - к сожалению, миф. GC далеко не всегда соображает, когда можно удалить объект - обнуление локальной ссылки перед выходом из метода ему сильно помогает. JIT создаёт неоптимальный код - элементарные оптимизации арифметических операций не выполняются. Качество оптимизации на этапе компиляции ниже плинтуса - в нижеследующем примере с автобоксингом всё очень и очень печально. Наконец, никто не отменял рефлексию smile 

Код
   /* 
    * Исходный код
    */

    public int sum(Integer... numbers) {
        Integer sum = 0;
        
        for (Integer number : numbers) {
            sum += number;
        }
        
        return sum;
    }

   /* 
    * После компиляции
    */

    public int sum(Integer numbers[]) {
        Integer sum = Integer.valueOf(0);
        Integer numbersCopy[] = numbers;
        int count = numbersCopy.length;
        for(int i = 0; i < count; i++) {
            Integer number = numbersCopy[i];
            sum = Integer.valueOf(sum.intValue() + number.intValue());
        }

        return sum.intValue();
    }


А пользительность модификатора final для параметров и локальных переменных (сюда же относятся исключения, декларированные в catch) - это действительно МИФ. Правда в том, что при использовании достаточно умного (!) компилятора этот модификатор не повредит (!) результату. Для каждого final-параметра в соответствующем классе будет зарезервировано финальное поле со всеми втекающими и вытекающими.

Добавлено через 1 минуту и 52 секунды
Кстати, ещё капля дёгтя - не удаляется мёртвый код.

Добавлено через 5 минут и 1 секунду
Да, собственно, главную мысль не сформулировал: модификатор final для методов, полей и параметров и локальных переменных - это, считайте, разные модификаторы smile 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Platon
Дата 24.10.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(w1nd @  23.10.2008,  14:07 Найти цитируемый пост)
Кстати, ещё капля дёгтя - не удаляется мёртвый код.

а я замечал, что простейшие ветки отсекает:
Код

if (DEBUG)
    System.out.println("debug mode only");


Не декомпилировал, но то, что строки "debug mode only" в байткоде не было косвено указывает на отсечение этой ветки.
PM MAIL ICQ   Вверх
w1nd
Дата 24.10.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(Platon @  24.10.2008,  11:48 Найти цитируемый пост)
а я замечал, что простейшие ветки отсекает

Да, это единственное, что оно умеет отсекать.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Royan
Дата 27.10.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Исходя из всего вышесказанного напрашивается такой вывод. Было бы здорово в будущих версиях java видеть все локальные переменные (в т.ч. параметры методов) константами по умолчанию, а те из них, что должны изменяться следует помечать как переменные, например, вот так:

Код

for (variable int i = 0; i < 10; i++) 


С одной стороны это изменение позволило бы избежать некоторого процента локальных багов, а с другой, разумеется, стало бы причиной несовместимости порядочного количества старого кода.


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Platon
Дата 27.10.2008, 14:02 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(Royan @  27.10.2008,  14:29 Найти цитируемый пост)
Исходя из всего вышесказанного напрашивается такой вывод.

что-то не напрашивается.

Цитата(Royan @  27.10.2008,  14:29 Найти цитируемый пост)
все локальные переменные (в т.ч. параметры методов) константами по умолчанию

нет, здорово бы не было.



PM MAIL ICQ   Вверх
LSD
Дата 27.10.2008, 14:14 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Royan @  27.10.2008,  14:29 Найти цитируемый пост)
Было бы здорово в будущих версиях java видеть все локальные переменные (в т.ч. параметры методов) константами по умолчанию, а те из них, что должны изменяться следует помечать как переменные, например, вот так:

Жесть.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Royan
Дата 28.10.2008, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



PlatonLSD
Хорошо почему нет?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1142 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.