Блок инициализации внутри конструктора - PullRequest
2 голосов
/ 08 июля 2011

Я знаю, что блок инициализации запускается после вызова super () в конструкторе. Однако, просматривая код утром, я обнаружил следующее:

public class SimpleListLocalsAnalysis extends BackwardFlowAnalysis
    FlowSet emptySet;

    public SimpleLiveLocalsAnalysis(UnitGraph graph) {
        super(graph);

        {
            Chain locals = g.getBody().getLocals();
            FlowUniverse localUniverse = new FlowUniverse(locals.toArray());
            emptySet = new ArrayPackedSet(localUniverse);
        }

        doAnalysis();
    }
...
}

Приведенный выше код показывает некоторую инициализацию, происходящую в блоке инициализации сразу после вызова super (graph). Какова цель размещения кода в блоке инициализации внутри конструктора, так как он обязательно запускается после вызова super. Я что-то здесь упускаю?

Ответы [ 2 ]

6 голосов
/ 08 июля 2011

Это не блок инициализации, это простой блок

так же, как

public void foo(){

  {
      //some code
  }
}

Назначение:

Вы можете иметь ограниченную область действия

2 голосов
/ 08 июля 2011

Лучший способ выяснить это, вероятно, спросить автора кода.Возможно, он окружил блок кода, чтобы указать на важность этих инициализаций.Или, может быть, он сделал это, потому что хочет показать, что locals и localUniverse используются только для инициализации emptySet.

С другой стороны, в Java вы можете сделать что-то вроде

public class SomeClass extend ParenClass{
    private int val;   

    {
        //initializztion block
        val = -1;
    }

    public SomeClass()
    {
        super();
    }

    public SomeClass(String iniName)
    {
        super(iniName);
    }   
}

Блок инициализации получит копию в начало каждого из конструкторов (после супер-вызова) во время компиляции,

Так что, возможно, автор скопировал и вставил блок кода в неправильное место;он скопировал его в конструктор, а не за его пределы.

...