Initialization Blocks เป็นบล๊อกที่ใช้ในการกำหนดค่าให้กับฟิลด์ในคลาส โดยเราจะประกาศ Initialization Blocks ไว้ก่อนเมธอดคอนสตรัคเตอร์แต่อยู่หลังจากการประกาศฟิลด์
Initialization Blocks แบ่งออกเป็น Static Initialization Blocks และ Instance Initialization Blocks โดย Static Initialization Blocks เอาไว้กำหนดค่าให้กับฟิลด์แบบ static และ ฟิลด์แบบ constant มีรูปแบบดังนี้
static {
// code
}
ตัวอย่างเช่น
import java.util.Date;
public class StaticInitBlockExample {
private static String stringField;
private static Date dateField;
private static final String A_STRING_CONSTANT;
static {
stringField = getEmptyString();
dateField = new Date();
A_STRING_CONSTANT = “unknown”;
}
private static String getEmptyString() {
return “empty”;
}
}
จากตัวอย่างสังเกตุว่าเราประกาศฟิลด์ stringField และ dateField เป็นฟิลด์แบบ static และประกาศ A_STRING_CONSTANT เป็นฟิลด์แบบ constant จากนั้นเราจึงกำหนดค่าให้กับตัวแปรโดยใช้ Static Initialization Blocks แทนที่จะกำหนดโดยตรงตั้งแต่ขั้นตอนการประกาศฟิลด์ หากเรามีการกำหนดค่าให้กับฟิลด์และมีการกำหนดค่าใน Static Initialization Blocks ค่าที่กำหนดให้กับฟิลด์จะถูกแก้ไขโดยค่าที่กำหนดใน Static Initialization Blocks เราสามารถกำหนด Static Initialization Blocks หลายๆบล๊อคได้โดยการทำงานจะเรียงลำดับตามที่เขียนไว้ในโปรแกรม
ส่วน Instance Initialization Blocks ก็เอาไว้กำหนดค่าให้กับฟิลด์ทั่วไป โดยมีรูปแบบ
{
// code
}
ตัวอย่างเช่น
class InstanceInitBlockExample {
private int field;
{
field = 40;
}
}
ทั้ง Static Initialization Blocks และ Instance Initialization Blocks จะทำงานก่อนเมธอด constructor เราใช้การกำหนดค่าด้วย Static Initialization Blocks และ Instance Initialization Blocks เมื่อต้องมีการดำเนินการที่ซับซ้อนเพื่อให้ได้ค่ามากำหนดให้กับฟิลด์ ซึ่งเรามักจะไม่เขียนโปรแกรมที่ต้องมีการดำเนินการที่ซับซ้อนไว้ในเมธอดคอนสตรัคเตอร์
ใน Instance Initialization Blocks เราสามารถเรียกใช้ฟิลด์หรือเมธอดที่เป็น static ได้ แต่เราจะไม่สามารถเรียกใช้ฟิลด์หรือเมธอดของออบเจกต์ (instance) ใน Static Initialization Blocks