Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание константы с динамическим значением 
:(
    Опции темы
PashaOvechkin
Дата 10.7.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

Репутация: 2
Всего: 4



Код

...
private static final boolean isFine= SuperClass.isSomethingOK(); 
public static final int COLUMN_ID = isFine? 2 : 1;
...

public static void main (String [] a){
int p = 5;

switch p {
 case COLUMN_ID:   // here is error
   //la la la
....
}
}


Необходимо создать константу, значание которой определяется при загрузке апликации, и оно может бытй разным.
PM MAIL Skype   Вверх
AntonSaburov
Дата 10.7.2008, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Если на этапе компиляции это не константа, то смысла уже никакого. 
Сделай класс, который будет инициализировать переменную внутри себя из какого-нибудь конфига и определи только get.
PM MAIL WWW ICQ   Вверх
PashaOvechkin
Дата 10.7.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

Репутация: 2
Всего: 4



хмм... А чем мой вариант плох? smile 
Всё компилится! До тех пор пока ету "константу" не используем в свиче...

Добавлено через 27 секунд
Помоему, так сделать просто нельзя (без рефлексии)
PM MAIL Skype   Вверх
niasilil
Дата 11.7.2008, 05:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



Нетипично очень, так final константы не определяют. Не надо так делать, другим же потом этот код читать


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
PashaOvechkin
Дата 11.7.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

Репутация: 2
Всего: 4



Ничего нeчитабельного в таком определении не вижу.
Другое дело что ето не совсем константа получается.... 
Несмотря на то что атрибут определён как: public static final

Это сообщение отредактировал(а) PashaOvechkin - 11.7.2008, 10:40
PM MAIL Skype   Вверх
powerOn
Дата 11.7.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



А Вы сможете гарантировать что вызов SuperClass.isSomethingOK() вернёт то адекватное значение? Порядок инициализации Вы как синхронизируете?   
Момент инициализации статических полей остаётся на усмотрение виртуальной машины. Обычно это происходит в момент загрузки класса, но не факт. Главное, что бы поле было инициализировано раньше чем прочитано. Существует определённая вероятность, что SuperClass.isSomethingOK() вернёт не верное значение в момент инициализации поля isFine. 




--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
PashaOvechkin
Дата 11.7.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

Репутация: 2
Всего: 4



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

Код

private static final boolean isFine= SuperClass.isSomethingOK(); 
public static final int COLUMN_ID = isFine? 2 : 1;


вроде как константа создаётся, но в итоге она левая какая то получается
PM MAIL Skype   Вверх
Kangaroo
Дата 11.7.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(PashaOvechkin @  10.7.2008,  17:20 Найти цитируемый пост)
switch p {
 case COLUMN_ID:   // here is error
   //la la la
....
}

В switch можно использовать только COMPILED TIME constant, а не просто константу.


--------------------
Lost....
PM MAIL MSN   Вверх
Shurr
Дата 11.7.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 24.10.2006

Репутация: 5
Всего: 7



PashaOvechkin
Идеология switch подразумевает увеличение скорости выполнения условных конструкций за счет создания таблицы переходов по заранее заданным значениям. Для создания таблицы переходов значение константы должно быть определено на этапе компиляции, а не на этапе выполнения.

PM MAIL   Вверх
PashaOvechkin
Дата 11.7.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

Репутация: 2
Всего: 4



Спасибо - не знал етого
А можно ссылочку для верности??
PM MAIL Skype   Вверх
Ulysses4j
Дата 11.7.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 2
Всего: 10



Kangaroo, интересно, спасибо за инфо, несколько неожиданно.
Цитата(PashaOvechkin @  11.7.2008,  15:21 Найти цитируемый пост)
А можно ссылочку для верности??

К примеру:
Цитата
Код
 switch ( int expression )
    {
        case int constantExpression :
            statement;
        [ case int constantExpression
            statement;  ]
        ...
        [ default :
            statement;  ]
    }

The case expression for each branch must evaluate to a different constant integer value at compile time.

Knudsen, Niemeyer. Learning Java 3ed, 2005: 4.4.1.5 switch statements.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Shurr
Дата 11.7.2008, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 24.10.2006

Репутация: 5
Всего: 7



Цитата(PashaOvechkin @ 11.7.2008,  14:21)
Спасибо - не знал етого
А можно ссылочку для верности??

Если по поводу требования compile-time constant - то тут прямая дорога к JLS. В частности пункт 14.10 The switch Statement так определяет лейбы:
Цитата
Any statement immediately contained by the switch block may be labeled with one or more case or default labels. These labels are said to be associated with the switch statement, as are the values of the constant expressions (§15.28) in the case labels. (выделение болдом мое - Shurr)
 
Пункт же 15.28 Constant Expression, на который идет ссылка, в числе прочего говорит:
Цитата
A compile-time constant expression is an expression denoting a value of primitive type or a String that is composed using only the following:

Literals of primitive type and literals of type String 
Casts to primitive types and casts to type String 
The unary operators +, -, ~, and ! (but not ++ or --) 
The multiplicative operators *, /, and % 
The additive operators + and - 
The shift operators <<, >>, and >>> 
The relational operators <, <=, >, and >= (but not instanceof) 
The equality operators == and != 
The bitwise and logical operators &, ^, and | 
The conditional-and operator && and the conditional-or operator || 
The ternary conditional operator ? : 
Simple names that refer to final variables whose initializers are constant expressions 
Qualified names of the form TypeName . Identifier that refer to final variables whose initializers are constant expressions

Т.е. ни о каких вызовах методов при инициализации значения речи не идет.


Что же касается преимущественной реализации оператора switch через таблицу переходов - в JLS этого, естественно, нету, т.к. это детали реализации. Но то, что исторически сложилось именно так - это факт. Так, навскидку, ссылок даже и не дам, разве что википедию smile :
Цитата
Compilation

If the constants form a compact range then a switch statement can be implemented very efficiently as if it were a choice based on whole numbers. This is often done by using a jump table.

А вообще мне кажется это в литературе по компиляторам должно быть.
PM MAIL   Вверх
Kangaroo
Дата 12.7.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(Ulysses4j @  11.7.2008,  21:22 Найти цитируемый пост)
Kangaroo, интересно, спасибо за инфо, несколько неожиданно.

Не зря, все-таки, подготовка к SCJP проходит smile


Shurr, спасибо за дополнительную инфу.


--------------------
Lost....
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.