What do curly braces in Java mean by themselves?

JavaSyntaxScopeCurly Braces

Java Problem Overview


I have some Java code that uses curly braces in two ways

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

What do those stand-alone curly braces after the first if statement mean?

Java Solutions


Solution 1 - Java

The only purpose of the extra braces is to provide scope-limit. The List<PExp> copy will only exist within those braces, and will have no scope outside of them.

If this is generated code, I assume the code-generator does this so it can insert some code (such as this) without having to worry about how many times it has inserted a List<PExp> copy and without having to worry about possibly renaming the variables if this snippet is inserted into the same method more than once.

Solution 2 - Java

I second what matt b wrote, and I'll add that another use I've seen of anonymous braces is to declare an implicit constructor in anonymous classes. For example:

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

Some unit-testing frameworks have taken this syntax to another level, which does allow some slick things which look totally uncompilable to work. Since they look unfamiliar, I am not such a big fan myself, but it is worthwhile to at least recognize what is going on if you run across this use.

Solution 3 - Java

I agree with the scope limit answer, but would add one thing.

Sometimes you see a construct like that in the code of people who like to fold sections of their code and have editors that will fold braces automatically. They use it to fold up their code in logical sections that don't fall into a function, class, loop, etc. that would usually be folded up.

Solution 4 - Java

I'd actually guess that someone forgot an else statement.

There's rarely a good reason to even bother with creating additional block scopes. In this, and most cases, it's far more likely someone may have forgotten to type their control statement than it is that they were doing something clever.

Solution 5 - Java

They make an inner scope. Variable declared inside these braces is not visible outside of them. This also applies to C/C++.

Solution 6 - Java

It is also used for initialization blocks.

Solution 7 - Java

Braces are also useful to reduce the scope in switch/case statements.

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

But you can write

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

Solution 8 - Java

I think they just define an unnamed level of scope.

Solution 9 - Java

They define a new scope which means that everything declared in this scope is not visible outside the curly braces.

Solution 10 - Java

The bring a scope, copy will not be visible outside of it, so you can declare another variable with same name later. And it can be gathered by the garbage collector right after you exit that scope. In this case copy serves as a temporary variable, so it is a good example.

Solution 11 - Java

As an interesting note: the braces actually enable a class of statements: declarations.

This is illegal: if(a) int f;

but this is legal: if(a) { int f; }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPaul WicksView Question on Stackoverflow
Solution 1 - Javamatt bView Answer on Stackoverflow
Solution 2 - JavaDov WassermanView Answer on Stackoverflow
Solution 3 - JavaEliView Answer on Stackoverflow
Solution 4 - JavaPatrickView Answer on Stackoverflow
Solution 5 - JavaPaweł HajdanView Answer on Stackoverflow
Solution 6 - JavaGabrielView Answer on Stackoverflow
Solution 7 - JavaPhilippView Answer on Stackoverflow
Solution 8 - JavaanonView Answer on Stackoverflow
Solution 9 - JavafheView Answer on Stackoverflow
Solution 10 - JavaPavel FeldmanView Answer on Stackoverflow
Solution 11 - JavaHugoView Answer on Stackoverflow