[Algorithm] Enforce noninstantiability with a private constructor

สวัสดีครับเหมือนเดิมช่วงนี้ผมกำลังอ่านหนังสือชื่อ Effective Java มันมีอยู่หัวข้อหนึ่งสอนเกี่ยวกับการป้องการการสร้าง object ของคลาสที่เราสร้าง ซึ่งผมเคยอ่านมาก่อนในหนังสือของ ดร.วีระศึกดฺ ซึ่งถาวร และ ดร. ได้บอกว่าวิธีการไว้สองตัวคือ abstract class และ private constructor แต่ในหนังสือเล่มที่ผมอ่านอยู่เขาบอกว่า abstract class ยังไม่สามารถป้องกันได้เพราะมันเข้าได้ เพราะมันเข้าได้ถึงจาก sub-class วิธีที่ดีที่สุดของหนังสือนี่บอกว่าให้ทำ private constructor แบบนี้ครับ

[sourcecode language=”java” wraplines=”false” collapse=”false”]
// Noninstantiable utility class
public class UtilityClass {
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
… // Remainder omitted
}
[/sourcecode]

ก็ประมาณนี้ครับ และมันควรจะใช้กับ class แบบไหน? คำตอบคือ

  • Utility classes/ Helper classes / service method 
  • กลุ่มของ static factory methods สำหรับตัวนี้ผมจะมาเขียนอธิบายไว้ทีหลังนะครับ

และประโยชน์มันคือไร? คำตอบคือ ผมจะเอาคำพูดในหนังสือของ  ดร.วีระศึกดฺ ซึ่งถาวร มาให้อ่านกันโดย ดร. ได้เขียนอธิบายไว้ดังนี้

“การเขียนโปรแกรมที่ดีนั้น ควรมีสมมุติฐานว่า ผูู้ใช้งานไม่ใช่โปรแกรมของเราในชอบเขตที่ควรเท่านั้น เพราะบางคนอาจจะไม่ทราบว่าขอบเขต คืออะไร หรือจงใจนำไปใช่ในทางที่ไม่สมควรก็ได้ เราจึงจำเป็นต้องเขียนโปรแกรมเพื่อป้องกันไม่ให้โปรแกรมของเราถูกนำไม่ใช้ในทางไม่สมควร หรือใช้งานในเงือนไขที่ไม่ถูกต้อง เราเรียกการเขียนโปรแกรมแบบนี้ว่า defensive programming เช่นตัวอย่างข้างบนเราป้องการไม่ใช้เอาคลาสนำไปใช้งานได้ หรือถูกนไปใช้ใส่ new นั้นเองครับ” เพียงแค่นี้คลาสเราก็ปลอดภัยแล้ว

credit : Java Programming Volume 1 , Effective Java , kodelog

Facebook Comments