I would recommend against the init block because it hurts readability.
For example:
class Foo {
int x;
{
x = 1;
}
Foo() {}
}
When a new Foo is instantiated, does the init block run? If I add another constructor, does the init block run for both constructors, or only the no-arg one?
If you just answered these questions with ease, and that made you feel good about using the init block, this should cause you to check yourself. That certainty that you feel? That's bad.
It's bad because you shouldn't make decisions about style based on how you feel, you should make them based on what is most readable. When you use an init block, other developers that come along and add another constructor—if they even notice the init block—are going to go, uhhhh, when does this thing run?
Just because the answer exists and you know it is not a good reason to write code a certain way. It should be obvious to others. This is not.
Better is:
class Foo {
int x = 1;
}
Most people have no issue with this. Now no matter how many constructors you add, most Java developers are going to know that x is initialized to 1.
Not forcing your peers to look stuff up is appreciated.