final & transient

Модератор: Absurd

Ответить
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Доброго времени суток!

В процессе поиска новых интересных средств разработки нашел плагин (программку) PMD, который ищет потенциальные ошибки в коде.
Среди прочих ошибок, которые он мне выдал, были две, о которых хочу спросить.

Как часто часто вы используете модификаторы "final" и "transient" в своём коде?

1. transient,
у меня J2SE приложение, которому сериализация не нужна
(надеюсь, я правильно понимаю суть сериализации, что она используется только для RMI ?)
А если она мне не нужна, то и transient писать не обязательно, или нет?

2. final,
чисто теоретически, все переменные методов, которые не будут (не должны) меняться внутри метода можно (или нужно?) пометить "final".
С другой стороны, просматривая время от времени исходники JDK я не встречал такого кода.
Так имеет ли смысл использовать final таким образом?
А заодно и все переменные, которые были присвоены лишь один раз при инициализации сделать final.
Повысит ли это надёжность программы?
Используете ли вы final в своём коде без особой надобности (когда об этом просит компилятор), или видели ли код с обильным колличеством такового?
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Oscar писал(а):Как часто часто вы используете модификаторы "final" и "transient" в своём коде?
final - постоянно, т.к не люблю переменные величины. Исключение - счетчики циклов, естественно. К сожалению, final более куцый чем C++ квалификатор const. Поэтому, дать клиенту срез данных только для чтения бывает проблематично.
Oscar писал(а): 1. transient,
у меня J2SE приложение, которому сериализация не нужна
(надеюсь, я правильно понимаю суть сериализации, что она используется только для RMI ?)
Если класс прямо или косвенно унаследован от Serializable, то тем не менее клиент может его сериализовать. Сериализовать можно и для того чтобы сохранить объект в blob-поле базы данных, например.
Oscar писал(а): чисто теоретически, все переменные методов, которые не будут (не должны) меняться внутри метода можно (или нужно?) пометить "final".
С другой стороны, просматривая время от времени исходники JDK я не встречал такого кода.
Так имеет ли смысл использовать final таким образом?
А заодно и все переменные, которые были присвоены лишь один раз при инициализации сделать final.
Повысит ли это надёжность программы?
Используете ли вы final в своём коде без особой надобности (когда об этом просит компилятор), или видели ли код с обильным колличеством такового?
По идее - необязательно, но наш код очень обильно сдобрен благодаря code conventions от заказчика. Но конечно же final это не const, и толк от него есть только в случае immutable объектов типа java.lang.String . Подробно об этом пишет Joshua Bloch в Effective Java.

Тему final раскрывает так же эта статья
http://renaud.waldura.com/doc/java/final-keyword.shtml
2B OR NOT(2B) = FF
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

transient= не только в RMI и BLOB. Если вы хотите записать объект в файл (writeObject), transient переменные не будут записаны
mobius
Сообщения: 157
Зарегистрирован: 25 янв 2005, 18:42
Откуда: Минск
Контактная информация:

По поводу final - если применико к переменной, то значит ссылка, которую содержит данная переменная, не может быть изменена. Но методы (к примеру add в List или append в StringBuffer) дёргаться могут. Соответсвенно содержимое объекта может меняться, но сам объект нет.

Если применимо к методам, то эти методы нельзя будет переопределить, если к классам, то от этих классов нельзя унаследоваться, как вслучае со String.

По поводу надёжности решать тебе :) Но константы типа String int и т.п. конечно лучше делать static final

Типа безопасность и оптимизация
Всё об отдыхе на http://chugaga.com
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

mobius, спасибо, способы приминения final мне знакомы,
меня именно интересовало, стоит ли применять его для, так сказать, надёжности.
если каждому неприсваемому в методе параметру (а я сторонник того, чтобы так было всегда) дописывать final, то код IMHO, будет загромаждаться, что может привести к нечитабельности ...
хотя, наверное, это просто дело привычки и стиля ..
mobius
Сообщения: 157
Зарегистрирован: 25 янв 2005, 18:42
Откуда: Минск
Контактная информация:

По поводу надёжности... Трудно сказать. На мой взгляд надёжность должна обеспечиваться архитектурой и стилем. Использование fianl ко всему этому... не встречалось как-то
Всё об отдыхе на http://chugaga.com
Ответить