2016-10-23 2 views
2

Хммм ... Я м не в состоянии придумать лучшее название для этого вопросастатическое назначение вызова метода дважды

я м не в состоянии понять, почему вызов статического метода и назначая его значение на другое статический член дважды вызывает метод getValue().

Если я перемещаю статическое назначение после метода main, он не загружается дважды. Я знаю, что это глупо, но я пропускаю что-то очевидное?

public class Test { 
    private static Integer value1 = getValue(); // This is causing to load again 

    private static Integer flag = null; 

    public static Integer getValue() { 
     if (flag != null) { // if flag is loaded already, return it. 
      return flag; 
     } 

     System.out.println("Loading value..."); 

     flag = Integer.valueOf(10); 

     return flag; 
    } 

    public static void main(String[] args) { 
     getValue(); 
    } 

    private static Integer value2 = getValue(); // This will not cause to load again 
} 

Выход:

Loading value... 
Loading value... 

Тест онлайн: https://ideone.com/pgRbff

ответ

7

Давайте пошагово несколько ключевых направлений.

Эта линия:

private static Integer value1 = getValue(); 

печатает "Загрузка значения ..." и устанавливает flag в ненулевое значение.

Затем эта линия:

private static Integer flag = null; 

наборы flagобратно null.

Затем эта линия:

private static Integer value2 = getValue(); 

печатает «Загрузка значения ...» снова и устанавливает flag к ненулевое значение снова.

Тогда main работает, и эта линия:

getValue(); 

не печатает ничего, потому что flag установлен в ненулевое значение.

+0

Это правильно. OP, вы можете проверить это, заменив объявления 'value1' и' flag' и отметив, что «Загрузка значения ...» печатается только один раз. – Vikram

+1

@Kamal: Это не имеет никакого отношения к порокам статических переменных. Это всего лишь дизайнерский запах. – Makoto

+0

Aaahh .. Я знал, что я здесь глуп ... Как я пропустил ... Моя голова показывает признаки лишенного сна ... lol ... Еще раз спасибо ... – manikanta

-2

Это хороший вопрос. Classloader следуют некоторому правилу для загрузки класса, сначала статические инструкции загружают и создают память для этого в области класса в кучевой памяти.

Смежные вопросы