21/10/58

Initialization Block ในภาษา Java

Initialization Block ในภาษา Java

บทความนี้เรามาดูวิธีการใช้ Initialization Block ในภาษา Java กันครับ ว่า Initialization Block มันคืออะไร ใช้ยังไง และต้องรู้อะไรบ้าง

ก่อนอื่นเรามาดูวิธีการใช้งาน Initialization Block แบบง่าย ๆ กันก่อน ตามด้านล่างเลย

package info.doesystem.howto;

public class DoesystemInfo {
 static int x;

 static {
  x = 50;
 }
}

จากโค้ดจะเห็นว่าเรามีบล็อกอยู่ ซึ่งในที่นี้ก็คือ ในวงเล็บ { และ } จะเห็นว่าเป็นบล็อกอยู่ ถ้าแปรตรง ๆ Initialization ก็คือการเริ่มต้น Block ก็คือบล็อก ถ้านำมารวมกัน ก็น่าจะแปลว่า บล็อกเริ่มต้น แล้วใช้ยังไง มีประโยชน์ยังไง มาดูกันต่อไปครับ

A non-static initialization block

- จะ Executed แต่ละครั้งที่ Object ได้สร้างขึ้น - สามารถกำหนดค่าตัวแปรเริ่มต้นใน class ตัวอย่างโค้ด java

package info.doesystem.howto;

class TestNonStaticBlock {
 int a;
 static int b;
 
 {
  a = 0;
  b = 0;
  System.out.println("Running initialization block. Class TestNonStaticBlock");
 }
}

static initialization block

- จะใช้คำว่า static ในการนำหน้าบล็อก
- จะ Executed ครั้งเดียว เมื่อ Class ถูกโหลดขึ้นมา
- สามารถกำหนดค่าเริ่มต้นเฉพาะตัวแปรที่เป็น static เท่านั้น

ตัวอย่างโค้ด java

package info.doesystem.howto;

class TestStaticBlock {
 int a;
 static int b;
 
 static {
  b = 0;
  System.out.println("Running initialization block. Class TestStaticBlock");
 }
}

A non-static initialization block VS static initialization block

ต่อไปมาลองดูความแตกต่างโดยการรันโค้ดดูครับ โค้ดตามด้านล่าง

package info.doesystem.howto;

class TestNonStaticBlock {
 int a;
 static int b;

 {
  a = 0;
  b = 0;
  System.out.println("Running initialization block. Class TestNonStaticBlock");
 }
}

class TestStaticBlock {
 int a;
 static int b;

 static {
  b = 0;
  System.out.println("Running initialization block. Class TestStaticBlock");
 }
}

public class DoesystemInfo {
 public static void main(String[] args) {
  new TestNonStaticBlock();
  new TestNonStaticBlock();
  new TestStaticBlock();
  new TestStaticBlock();
 }
}


จากโค้ด ผลลัพธ์ที่ด้คือ
Running initialization block. Class TestNonStaticBlock
Running initialization block. Class TestNonStaticBlock
Running initialization block. Class TestStaticBlock

จากนั้นลองรันโค้ด

package info.doesystem.howto;

class TestNonStaticBlock {
 int a;
 static int b;

 {
  a = 0;
  b = 0;
  System.out.println("Running initialization block. Class TestNonStaticBlock");
 }
}

class TestStaticBlock {
 int a;
 static int b;

 static {
  b = 0;
  System.out.println("Running initialization block. Class TestStaticBlock");
 }
}

public class DoesystemInfo {
 public static void main(String[] args) {
  System.out.println(TestNonStaticBlock.b);
  System.out.println(TestNonStaticBlock.b);
  System.out.println(TestStaticBlock.b);
  System.out.println(TestStaticBlock.b);
 }
}


ผลลัพธ์ที่ได้ คือ

0
0
Running initialization block. Class TestStaticBlock
0
0

จะเห็นว่า ที่เรารันโค้ดทดสอบแรก จะเกิดการ Execute บล็อก Running initialization block. Class TestNonStaticBlock สองครั้งเพราะเราสร้าง Object ขึ้นมาสองตัว จากนั้นเราก็ลองสร้าง Object กับ Class TestStaticBlock เหมือนกัน แต่จะแสดง Running initialization block. Class TestStaticBlock ขึ้นมาแค่ครั้งเดียว เพราะจะรันครั้งเดียวแค่ตอน Class ตอนโหลดเท่านั้น

จากนั้นเราก็แสดงตัวอย่างที่สอง โดยการใช้ชื่อ Class แล้วตามด้วยตัวแปร จะเห็นว่าไม่มี Running initialization block. Class TestNonStaticBlock เลยเพราะเราไม่ได้สร้าง Object ดังนั้น block ที่ไม่ใช่ static จึงไม่ได้ Execute

ไม่มีความคิดเห็น:

แสดงความคิดเห็น