| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Создание константы с динамическим значением |
| Автор: PashaOvechkin 10.7.2008, 17:20 | ||
Необходимо создать константу, значание которой определяется при загрузке апликации, и оно может бытй разным. |
| Автор: AntonSaburov 10.7.2008, 19:28 |
| Если на этапе компиляции это не константа, то смысла уже никакого. Сделай класс, который будет инициализировать переменную внутри себя из какого-нибудь конфига и определи только get. |
| Автор: PashaOvechkin 10.7.2008, 19:40 |
| хмм... А чем мой вариант плох? Всё компилится! До тех пор пока ету "константу" не используем в свиче... Добавлено через 27 секунд Помоему, так сделать просто нельзя (без рефлексии) |
| Автор: niasilil 11.7.2008, 05:09 |
| Нетипично очень, так final константы не определяют. Не надо так делать, другим же потом этот код читать |
| Автор: PashaOvechkin 11.7.2008, 10:40 |
| Ничего нeчитабельного в таком определении не вижу. Другое дело что ето не совсем константа получается.... Несмотря на то что атрибут определён как: public static final |
| Автор: powerOn 11.7.2008, 11:13 |
| А Вы сможете гарантировать что вызов SuperClass.isSomethingOK() вернёт то адекватное значение? Порядок инициализации Вы как синхронизируете? Момент инициализации статических полей остаётся на усмотрение виртуальной машины. Обычно это происходит в момент загрузки класса, но не факт. Главное, что бы поле было инициализировано раньше чем прочитано. Существует определённая вероятность, что SuperClass.isSomethingOK() вернёт не верное значение в момент инициализации поля isFine. |
| Автор: PashaOvechkin 11.7.2008, 12:09 | ||
| Я же ничего не утверждаю... Порядок инициализации статуческих компонентов в апликации одному богу (йвм) известен. Мне кажется странным что дозволено делать вот так ->
вроде как константа создаётся, но в итоге она левая какая то получается |
| Автор: Shurr 11.7.2008, 14:44 |
| PashaOvechkin Идеология switch подразумевает увеличение скорости выполнения условных конструкций за счет создания таблицы переходов по заранее заданным значениям. Для создания таблицы переходов значение константы должно быть определено на этапе компиляции, а не на этапе выполнения. |
| Автор: PashaOvechkin 11.7.2008, 15:21 |
| Спасибо - не знал етого А можно ссылочку для верности?? |
| Автор: Ulysses4j 11.7.2008, 21:22 | ||||
| Kangaroo, интересно, спасибо за инфо, несколько неожиданно. К примеру:
Knudsen, Niemeyer. Learning Java 3ed, 2005: 4.4.1.5 switch statements. |
| Автор: Shurr 11.7.2008, 23:12 | ||||||||
Если по поводу требования compile-time constant - то тут прямая дорога к JLS. В частности пункт http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#35518 так определяет лейбы:
Пункт же http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5313, на который идет ссылка, в числе прочего говорит:
Т.е. ни о каких вызовах методов при инициализации значения речи не идет. Что же касается преимущественной реализации оператора switch через таблицу переходов - в JLS этого, естественно, нету, т.к. это детали реализации. Но то, что исторически сложилось именно так - это факт. Так, навскидку, ссылок даже и не дам, разве что http://en.wikipedia.org/wiki/Switch_statement
А вообще мне кажется это в литературе по компиляторам должно быть. |
| Автор: Kangaroo 12.7.2008, 13:32 |
Не зря, все-таки, подготовка к SCJP проходит Shurr, спасибо за дополнительную инфу. |