Свернуть ↑
Цитата:
Сообщение от Хлорка
Для тех, кто в танке:
Даже статичная переменная может вызвать исключения пакета java.lang даже при обычном одноподтечном программировании. Например, NullPointerException, UnsupportedOperationException или какой-нить еще.
Код:
class HlorkaGood {
public static Object HLORA_IS_MY_FRIEND;
...
}
// Обращаемся к переменной
...
Object test = HlorkaGood.HLORA_IS_MY_FRIEND;
...
// Будет исключение NullPointerException
Поэтому что не инициализировали. Если переменная не константа, то должна иметь дефолтовое значени или полуконстанта (файл конфигурации), то используйте блоки static - это как аналог директивам Си.
Код:
class HlorkaTheBest{
public static Object HLORA_IS_MY_FRIEND;
...
static {
HLORA_IS_MY_FRIEND = new String();
}
}
Для полуконстант, рекомендуется в блоке статик выполнять загрузку файла конфигурации. Если файл конфигурации имеет опии разработчика, то его как правила пихают в JAR-библиотеку, в последнем случае используют доступ к ресурсу по URL через статичный метод ClassLoader'а:
Код:
InputStream s = ClassLoader.getResourceAsStream("org/mylib/test/hlorka.properties");
Тут есть 1 косяк, многие использую одноименный метод из собственного класса, т.е. HlorkaTheBest.getResourceAsStream(?), но в этом случае надо будет ставить еще 1 слеш в самом начале, иначе будет ругаться. что ресурс ненайден.
Также есть 1 удобный способ программирования, когда у вас конфиги имеют 1 тип данных, ну например все экземпляры типа String или int, то удобно запонять их из файла конфигураций через пакет Reflect, но эт уже совсем проффессионалы так делают. Это имеет смысл для каких-то текстовых сообщейни. А вообще не забывайте что в яве реализована возможность интернационализации через java.util.MessageBuilder, весьма удобно при написании мультиязычного приложения. Хотя это скорее локализация, чем интернационализация, т.к. последняя подразумевает не только смену языка.
|
Свернуть ↑Развернуть ↓
Я извиняюсь, конечно, но какой-то несвязный бред.
1. Если переменная не константа (в случае Java, не static final), то это совершенно не означает, что ее обязательно инициализировать в месте объявления;
2. Java не позволит Вам использовать не инициализированную хоть чем-нибудь переменную. Соответственно, NPE актуален, когда переменная равна null - это разные вещи;
3. static != const вообще ни разу, почитайте что-нибудь про ООП;
4. Откуда Вы вообще взяли понятие "полустатичная переменная"? Переменная может быть static или non-static, другого не дано, Вы явно не понимаете смысл статических свойств и методов классов;
5. Для хранения загружаемых конфигов имеет смысл использовать final static, а не просто static-переменные. Применение static-переменных оправдано, потому что при создании экзмепляров классов, такие переменные не нуждаются в копировании для каждого объекта, а хранятся дружно в одном месте.
6. Чтобы использовать Reflection не нужно быть безумно-профессиональным, Reflection + Annotations могут дать довольно хороший буст в понимании написанного кода.