Pergunta

Eu tenho algum código Java que usa chaves de duas maneiras

// Curly braces attached to an 'if' statement:
if(node.getId() != null)
{
    node.getId().apply(this);
}

// Curly braces by themselves:
{
    List<PExp> copy = new ArrayList<PExp>(node.getArgs());
    for(PExp e : copy)
    {
        e.apply(this);
    }
}
outAMethodExp(node);

O que fazer essas chaves independentes após a primeira média declaração if?

Foi útil?

Solução

A única finalidade das chaves extras é fornecer âmbito-limite. O List<PExp> copy só existirá dentro dessas chaves, e não terá nenhum fora do escopo delas.

Se este é o código gerado, eu assumo o código-gerador faz isso para que ele possa inserir um código (como este) sem ter que se preocupar com quantas vezes ele inseriu um List<PExp> copy e sem ter que se preocupar sobre a possibilidade de mudar o nome do variáveis ??se esse trecho é inserido no mesmo método mais de uma vez.

Outras dicas

Eu segundo o mate b escreveu, e eu vou acrescentar que outro uso que eu vi de chaves anônimos é declarar um construtor implícito nas classes anônimas. Por exemplo:

  List<String> names = new ArrayList<String>() {
    // I want to initialize this ArrayList instace in-line,
    // but I can't define a constructor for an anonymous class:
      {
        add("Adam");
        add("Eve");
      }

  };

Algumas estruturas de teste de unidade ter tomado esta sintaxe para um outro nível, que não permite que algumas coisas lisos que parecem totalmente uncompilable ao trabalho. Uma vez que eles olhar desconhecido, eu não sou um grande fã mesmo, mas vale a pena, pelo menos, reconhecer o que está acontecendo, se você se depara com este uso.

Eu concordo com a resposta limite de alcance, mas gostaria de acrescentar uma coisa.

Às vezes você vê uma construção como essa no código de pessoas que gostam de dobrar seções do seu código e têm editores que irá dobrar chaves automaticamente. Eles usá-lo para dobrar seu código em seções lógicas que não se enquadram em uma função, classe, loop, etc. que normalmente ser dobrado.

Eu realmente acho que alguém se esqueceu de uma outra declaração.

Raramente há uma boa razão para sequer se preocupar com a criação de escopos de blocos adicionais. Neste, ea maioria dos casos, é muito mais provável que alguém pode ter esquecido de escrever sua declaração de controle do que é que eles estavam fazendo algo inteligente.

Eles fazem um escopo interior. Variável declarada dentro destas chaves não é visível fora deles. Isso vale também para C / C ++.

Suspensórios também são úteis para reduzir o escopo no interruptor / declarações de caso.

switch(foo) {
  case BAR:
     int i = ...
     ...
  case BAZ:
     int i = ... // error, "i" already defined in scope
}

Mas você pode escrever

switch(foo) {
  case BAR:{
     int i = ...
     ...
  }
  case BAZ:{
     int i = ... // OK
  }
}

Ele também é usado para inicialização blocos .

Eles definem um novo escopo que significa que tudo declarou neste âmbito não é visível fora as chaves.

Como uma nota interessante: as chaves realmente permitir uma classe de declarações:. Declarações

Este é ilegal: if(a) int f;

mas isso é legal: if(a) { int f; }

Eu acho que eles apenas definir um nível sem nome do escopo.

A trazer um escopo, cópia não será visível fora dele, para que possa declarar outra variável com o mesmo nome mais tarde. E isso pode ser recolhida pelo coletor de lixo logo depois de sair desse âmbito. Neste caso, cópia serve como uma variável temporária, por isso é um bom exemplo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top