Страница 1 из 1

final & transient

Добавлено: 02 апр 2007, 15:46
Oscar
Доброго времени суток!

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

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

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

2. final,
чисто теоретически, все переменные методов, которые не будут (не должны) меняться внутри метода можно (или нужно?) пометить "final".
С другой стороны, просматривая время от времени исходники JDK я не встречал такого кода.
Так имеет ли смысл использовать final таким образом?
А заодно и все переменные, которые были присвоены лишь один раз при инициализации сделать final.
Повысит ли это надёжность программы?
Используете ли вы final в своём коде без особой надобности (когда об этом просит компилятор), или видели ли код с обильным колличеством такового?

Re: final & transient

Добавлено: 02 апр 2007, 16:25
Absurd
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

Re: final & transient

Добавлено: 02 апр 2007, 18:31
michael
transient= не только в RMI и BLOB. Если вы хотите записать объект в файл (writeObject), transient переменные не будут записаны

Re: final & transient

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

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

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

Типа безопасность и оптимизация

Re: final & transient

Добавлено: 09 апр 2007, 16:08
Oscar
mobius, спасибо, способы приминения final мне знакомы,
меня именно интересовало, стоит ли применять его для, так сказать, надёжности.
если каждому неприсваемому в методе параметру (а я сторонник того, чтобы так было всегда) дописывать final, то код IMHO, будет загромаждаться, что может привести к нечитабельности ...
хотя, наверное, это просто дело привычки и стиля ..

Re: final & transient

Добавлено: 10 апр 2007, 11:39
mobius
По поводу надёжности... Трудно сказать. На мой взгляд надёжность должна обеспечиваться архитектурой и стилем. Использование fianl ко всему этому... не встречалось как-то