/ 365วันแห่งโปรแกรม

[365 วันแห่งโปรแกรม #day32] Static

วันที่สามสิบสองของ ‪#‎365วันแห่งโปรแกรม วันนี้เราจะคุยกันเรื่อง Static keyword


Static keyword คืออะไร?

ในหลายๆ ภาษาโปรแกรมมีการ reserve คำว่า static ไว้ เพื่อใช้ในความหมายพิเศษ สำหรับทำ static variable หรือ static method โดยทั่วไปแล้วเมื่อมีการใช้ static นำหน้าการประกาศตัวแปรหรือเมธอดแล้ว จะหมายความว่า

  • ตัวแปรหรือเมธอดนั้นจะขึ้นอยู่กับคลาสของมัน ไม่ใช่ instance

  • ตัวแปรหรือเมธอดนั้นจะถูก initialize เพียงครั้งเดียว คือครั้งแรกที่มีารโหลดคลาสนั้น

  • ตัวแปรหรือเมธอดจะถูกแชร์ให้ทุก instance ของคลาสนั้น ไม่ว่าจะเรียกจาก instance ตัวไหน ก็จะได้ตัวแปรหรือเมธอดเดียวกัน และในกรณีที่เป็นตัวแปรเมื่อถูกเปลี่ยนค่าแล้ว instance อื่นก็จะเห็นค่าที่เปลี่ยนด้วย

  • เราสามารถเรียกใช้ตัวแปรหรือเมธอดนั้นได้จากที่ไหนก็ได้โดยไม่ต้องสร้าง instance ของคลาสนั้น

แล้วเอาไปทำอะไรได้บ้าง?

ในภาษาที่เป็น Pure OOP แล้ว เราไม่สามารถเริ่มโปรแกรมได้โดยไม่มี Static Method เช่นในจาวา เราจำเป็นต้องสร้าง main(string [] args) แบบ public static เพื่อบอกจาวาว่าตรงนี้คือจุดเริ่มต้นของโปรแกรมนะ

class Program{
	public static void main(String [] args){
		//do something
	}
}

โดยทั่วไปแล้วเรามักจะประกาศ Static method ก็ต่อเมื่อเมธอดนั้นถูกเรียกใช้บ่อยครั้ง หรือการสร้าง instance ของคลาสเพื่อเรียกใช้ method นั้นดูไม่ make sense เช่น คลาสเกี่ยวกับ utility ต่างๆ (ตัวอย่างคือ Console ใน C#, System ใน Java) หรือคลาสสำหรับคำนวณทางคณิตศาสตร์ ซึ่งการใช้ static method จะทำให้ชีวิตง่ายขึ้น ><

class Math{
	public static double abs(double a){
		//do something
	}
    
    public static double log(double a){
		//do something
	}
}

ในการสร้าง Singleton class เราใช้ Static variable เพื่อเก็บ instance ของคลาสนั้น ซึ่งทำให้เราแน่ใจได้ว่ามีเพียง instance เดียว

public class Foo {
	private static Foo instance = null;

	private Foo() {}

	public static Foo getInstance() {
    	if (instance == null) {
        	instance = new Foo();
    	}
    	return instance;
	}
}

การใช้ Static variable ทำให้ประหยัด memory เพราะสร้างตัวแปรแค่ครั้งเดียวแล้วใช้ได้กับทุกที่ เหมาะสำหรับใช้กับตัวแปรที่ต้องแชร์ร่วมกันระหว่าง instance หรือตัวแปรที่เป็น Constant(ในบางภาษาถ้าประกาศว่าตัวแปรเป็น Constant แล้วจะถือว่าตัวแปรนั้นเป็น Static โดยอัตโนมัติ)

public static final float PI = 3.1415927;

ในบางภาษาโปรแกรมมีการใช้ Static keyword ในความหมายอื่นๆ (ที่ค้ลายๆ กัน) ด้วย เช่น C# บอกว่าถ้าใช้ static นำหน้าส่วนประกาศคลาสแล้ว จะถือว่าคลาสนั้นเป็นคลาสที่ไม่สามารถสร้าง instance ได้ เป็นต้น

‪#‎day32 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...