2016-03-01 2 views
0

У меня есть небольшой класс, который содержит статическую конечную переменную и статическую функцию:Статическая функция возвращает неправильное значение?

public class GlobalConstants { 
    public static final boolean ONLINE = true; 

    public static boolean isOnline(){ 
     return ONLINE; 
    } 
} 

(конечно есть немного дублирования кода, но не обращайте внимания, что)

Я упаковать свою программу бегущая баночка и получить странный результат:

log.debug(GlobalConstants.isOnline()); //prints false 
log.debug(GlobalConstants.ONLINE); //prints true 

Я ожидаю, что оба они напечатают «true».

Является ли компилятор java оптимизацией, вызывающей это странное поведение, или я что-то упускаю?

+0

Вы не устанавливаете isOnline, вы устанавливаете ONLINE. – durbnpoisn

+4

Вы действительно использовали этот минимальный пример? Может быть, вы удалили некоторые важные части из кода? Я создал проект и выполнил ваш код. Он работал нормально. –

+0

@Neuron нет, это часть большой программы, но обе строки log.debug вызываются при запуске программы и вызывается друг за другом. Обратите внимание, что в eclipse он работает правильно, только когда я упаковываю его в runnable jar, строки log.debug печатают неправильные значения. –

ответ

0

Приветствия за помощь! Найденная проблема, оказалось, что у моего локального репозитория maven была потерянная копия библиотеки, содержащей класс GlobalConstants. Этот класс был включен как зависимость в runnable jar. Но это не объясняет вывод «false, true», если GlobalConstants.ONLINE не преобразуется в логическое значение при оптимизации с помощью java-компилятора (потому что он является окончательным). Меня это немного смущает.

[обновление] Я декомпилированы мой класс и в самом деле:

System.out.println(GlobalConstants.ONLINE); 
System.out.println(GlobalConstants.isOnline()); 

преобразуется Java компилятором:

System.out.println(true); 
System.out.println(GlobalConstants.isOnline()); 

Теперь все понятно, и это объясняет результат в моей должности , Потому что даже когда он использовал неправильную версию класса, он должен был получить тот же результат (true, true). Но поскольку java-компилятор делает магию, возможно, что он вернул true, false.

1

Посмотрите на this project Я настроил ваш код. Он работает так же, как ожидалось, ваша ошибка должна лежать в некоторых частях кода, который вы удалили, чтобы упростить пример кода.

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

+0

Я действительно согласен, что он не должен возвращать истину и ложь, но истинную и истинную, что делает весь смысл в мире ;-) Отсюда мой вопрос. Я подозреваю, что могу сделать что-то ужасное. Я отправлю комментарий, когда узнаю, что. –