Domanda

Ho del codice Java che utilizza parentesi graffe in due modi

// 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);

Cosa significano quelle parentesi graffe autonome dopo la prima istruzione if?

È stato utile?

Soluzione

L'unico scopo delle parentesi graffe extra è fornire il limite dell'ambito. List<PExp> copy esisterà solo all'interno di quelle parentesi graffe e non avrà alcun ambito al di fuori di esse.

Se questo è un codice generato, suppongo che il generatore di codice lo faccia in modo che possa inserire del codice (come questo) senza doversi preoccupare di quante volte ha inserito un <=> e senza doversi preoccupare rinominare le variabili se questo frammento viene inserito nello stesso metodo più di una volta.

Altri suggerimenti

Secondo ciò che ha scritto Matt b, e aggiungerò che un altro uso che ho visto delle parentesi graffe anonime è quello di dichiarare un costruttore implicito in classi anonime. Ad esempio:

  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");
      }

  };

Alcuni framework di test unitari hanno portato questa sintassi a un altro livello, il che consente ad alcune cose fluide che sembrano totalmente incompatibili di funzionare. Dato che sembrano sconosciuti, non sono un grande fan me stesso, ma vale la pena riconoscere almeno cosa sta succedendo se ti imbatti in questo uso.

Sono d'accordo con la risposta sul limite dell'ambito, ma aggiungerei una cosa.

A volte vedi un costrutto simile nel codice delle persone a cui piace piegare sezioni del loro codice e avere editor che piegheranno automaticamente le parentesi graffe. Lo usano per piegare il loro codice in sezioni logiche che non rientrano in una funzione, classe, ciclo, ecc. Che normalmente verrebbero piegate.

Immagino che qualcuno abbia dimenticato un'altra affermazione.

Raramente c'è una buona ragione per preoccuparsi di creare ambiti di blocco aggiuntivi. In questo e nella maggior parte dei casi, è molto più probabile che qualcuno abbia dimenticato di digitare la propria dichiarazione di controllo piuttosto che fare qualcosa di intelligente.

Fanno un ambito interno. La variabile dichiarata all'interno di queste parentesi graffe non è visibile al di fuori di esse. Questo vale anche per C / C ++.

Le parentesi graffe sono utili anche per ridurre l'ambito delle istruzioni switch / case.

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

Ma puoi scrivere

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

È utilizzato anche per blocchi di inizializzazione .

Definiscono un nuovo ambito, il che significa che tutto quanto dichiarato in questo ambito non è visibile al di fuori delle parentesi graffe.

Come nota interessante: le parentesi graffe abilitano effettivamente una classe di dichiarazioni: dichiarazioni.

Questo è illegale: if(a) int f;

ma questo è legale: if(a) { int f; }

Penso che definiscano solo un livello di ambito senza nome.

Il portare un ambito, copia non sarà visibile al di fuori di esso, quindi puoi dichiarare un'altra variabile con lo stesso nome in un secondo momento. E può essere raccolto dal Garbage Collector subito dopo aver chiuso tale ambito. In questo caso copia funge da variabile temporanea, quindi è un buon esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top