อ่าน Effective Java ตอนที่ 4 (Noninstantiability)

ตอนที่สี่มาแล้ว ตามมาติดๆหลังจากเขียนตอนที่สามไปหมาดๆ Effective Java ตอนที่ 3 (Singleton) ซึ่งตอนนี้ผมจะมาพูดเรื่องการทำ private constructor ให้ไม่มีใครสามารถสร้าง instance ได้

อาจมีบางที่ที่เราต้องการสร้าง Utility class ที่มีแต่พวก static method และ static field อยู่เต็มไปหมด เหมือน java.lang.Math หรือ java.util.Arrays ที่เราสามารถใช้ static method ต่างๆได้ (รวมถึง static factory method ด้วย)

Utility class เหล่านี้ ไม่ได้ออกแบบมาให้สร้างเป็น object ได้ และเราก็ควรที่จะทำให้มันทำแบบนั้นไม่ได้ด้วยเช่นกัน การที่เราไม่ทำอะไร คือเรากำลังสร้าง default constructor หรือ public constructor ที่ไม่มี parameter อะไร ซึ่งการทำแบบนี้อาจจะทำให้มีการสร้าง instance ที่ไม่ต้องการออกมาได้

การสร้าง class ที่เราไม่ต้องการให้สร้าง instance ได้นั้นจะใช้ abstract ไม่ได้ผล เพราะ class นั้นยังสามารถนำไป subclass ได้อยู่ แล้วการใช้ abstract ยังเป็นการส่งเสริมให้คนที่ใช้ class นี้ นำ class นี้ไป implements ต่อ ตามจุดประสงค์ของ abstract class อีกด้วย

เพราะฉะนั้นเราจึงใช้ private constructor ไงหล่ะ เพื่อการป้องกันการสร้าง instance จาก class เหล่านั้น

// Noninstantiable utility class 
public class UtilityClass { 
  // Suppress default constructor for noninstantiability 
  private UtilityClass() { 
    throw new AssertionError(); 
  }

  ... // Remainder omitted 
}

เพราะมันเป็น private ไงหล่ะ ใครจะไปสร้างได้ 😉

แถมการ throw AssertionError ยังช่วยให้เวลามีใครมาเผลอเรียก (เราเองนั่นแหละเพราะ เรียกได้แค่ใน class เดี่ยวกัน) ยังเป็นการช่วยเตือนอีกด้วย (AssertionError ไม่เจ้งตอน runtime นะ)

Comments