Для каких типов переменные никогда не должны быть статическими? - PullRequest
1 голос
/ 01 декабря 2010

В одной библиотеке, которая интенсивно используется в нашем проекте, есть ограничение, что переменные ее классов никогда не должны быть статическими.(Это ULC ).Насколько я понял, это из-за необходимости сериализации их всех.И проблема с этим правилом в том, что оно не является строгим и может быть причиной ошибок, которые очень сложно отлаживать.

Мы собираемся написать модуль для Checkstyle, чтобы обнаруживать статические переменные таких типов (вероятно, обнаруживаемые некоторым настраиваемым регулярным выражением).И нам нужно знать, насколько необходима эта проверка для других разработчиков.

Итак, вопрос в том, каковы общие обстоятельства, когда переменные некоторых типов никогда не должны быть статическими?

Ответы [ 2 ]

1 голос
/ 01 декабря 2010

Во-первых, правильное объектно-ориентированное проектирование должно информировать о решении сделать метод / поле статичным.

Во-вторых, в веб-приложении, где все запросы обрабатываются в отдельных потоках, вы должны быть очень осторожны при использовании статических методов / полей. Если ваш статический метод поддерживает какое-либо состояние между вызовами (например, с помощью статического поля для хранения счетчика), вы можете столкнуться с проблемами многопоточности. Это происходит потому, что один запрос может вызывать статический метод, а затем останавливаться в середине выполнения другим потоком, который вызывает метод. Если первый вызов изменил общий ресурс, но не завершился, второй вызов может повредить ход первого выполнения.

0 голосов
/ 01 декабря 2010

Простой ответ: тип никогда не должен использоваться в качестве статического экземпляра, если он будет изменен небезопасным способом.я подозреваю, что именно поэтому ULC рекомендует не использовать их типы таким образом (не из-за сериализации).

к сожалению, проверить это с помощью чего-то вроде checkstyle чрезвычайно сложно.Например, HashMap не является потокобезопасным.однако, если я создаю экземпляр и заполняю его статически во время загрузки класса, а затем только когда-либо выполняю чтение с карты впоследствии, это безопасное использование HashMap (поскольку загрузка классов обеспечивает гарантию безопасности внешнего потока при настройке, и она никогда не изменяется впоследствии),

...