Packages

1 September 2016

Package คือการจัดหมวดหมู่หรือแบ่งแยกกลุ่มของคลาสให้เป็นกลุ่มๆ ซึ่งเรียกว่า namespaces เพื่อให้ง่ายต่อการใช้งานในการเขียนโปรแกรม หรือการทำให้โครงสร้างของโปรแกรมมีระเบียบ

Package นั้นมีแนวคิดคล้ายกับ file system ของระบบปฏิบัติการ ยกตัวอย่างเช่น เราใช้โฟล์เดอร์ในการจัดเก็บไฟล์ประเภทต่างๆ เช่นเดียวกันกับ package ในภาษา Java มันทำหน้าที่เหมือนโฟล์เดอร์ที่รวมคลาสเข้าไว้ด้วยกัน

Package เหมือนคลาสไลบรารี่ที่เก็บแยกไว้เป็นส่วนๆ เพื่อให้ง่ายต่อการใช้งาน และในภาษา Java ก็มี package ต่างๆ ที่จำเป็นให้ใช้มากมาย นอกจากนี้ package ยังสามารถจัดเก็บในรูปแบบของ compressed file ได้ ซึ่งจะไฟล์ extension เป็น .jar

java package hierarchy

จากรูปด้านบนเป็นตัวอย่างของ package ที่ดูในโปรแกรม Netbeans คุณจะพบว่ามันอยู่ในรูปแบบของ tree โดยมีโฟล์เดอร์ src เป็น root ของโปรเจ็ค ในความเป็นจริงแล้ว package ก็คือโฟล์เดอร์ที่ถูกเก็บอยู่ใน directory ของโปรเจ็คนั่นเอง

สร้าง Package ในภาษา Java

ในการสร้าง package ในภาษา Java อย่างที่เราได้บอก package นั้นถูกสร้างเป็น directory ในโฟล์เดอร์โปรเจ็คของเรา เช่น คุณสร้างโปรเจ็คของคุณไว้ที่ D:/project/MarcusCode/src/ คุณสามารถสร้าง package ทั้งหมดได้ภายในโฟล์เดอร์ src เพราะมันคือ directory root ของโปรเจ็ค

อีกวิธีหนึ่งซึ่งเป็นวิธีหลักและง่ายต่อการสร้าง package คือการสร้างใน IDE ที่คุณใช้เขียนโปรแกรม เช่น ในโปรแกรม Netbeans คลิกขวาที่ โปรเจ็คแล้วเลือก New -> Java Package...

Image on Marcuscode

รูปตัวอย่างการสร้าง package ในโปรแกรม Netbeans

แน่นอนว่า package ถูกออกแบบมาเพื่อจัดเก็บคลาสต่างๆ ให้เป็นหมวดหมู่ เราสามารถแยกคลาสแต่ละคลาสออกเป็นคลาสย่อยๆ ได้ ซึ่งการแบ่งโปรแกรมเป็นไฟล์ย่อยๆ จะทำให้โปรแกรมทำงานได้เร็วขึ้น เพราะเราเรียกใช้แค่คลาสที่จำเป็นเท่านั้น

สร้างคลาสภายใน package

คลาสที่อยู่ภายใน package จะต้องกำหนด package ของมันในบรรทัดแรกเสมอ ตัวอย่างต่อไปเราจะสร้างคลาสสำหรับการแปลงค่าของความยาว

//LengthConvert.java
package unit.convert.length;

public class LengthConvert {
    public static float meterToFeet (float m) {
        return m * 3.28084f;
    }
    public static float centimeterToinch (float centi) {
        return centi * 0.393701f;
    }
}

ในตัวอย่าง เราได้สร้างคลาส LengthConvert ซึ่งอยู่ภายใน package unit.convert.length ซึ่งเป็น package ที่ซ่อนกันอยู่ เราใช้เครื่องหมายจุด (*) ในกรณีมันซ้อนกัน เราได้กำหนด package ด้วยคำสั่ง

package unit.convert.length;

คำสั่งนี้เป็นการบอก Java คอมไพเลอร์ให้ทราบคลาสนี้ถูกกำหนดให้อยู่ภายใน package unit.convert.length

คำสั่ง import package

ในการใช้งาน package ในภาษา Java นั้นจะใช้คำสั่ง import เพื่อนำเข้าคลาสภายใน package เข้ามาในโปรแกรมของเรา มันมีรูปแบบการใช้งานดังนี้

import package_name.ClassName; // import a class to program
import package_name.*; // import all classes to program

จากรูปแบบการใช้งานด้านบน คุณสามารถ import คลาสที่ระบุหรือทั้งหมดภายใน package ก็ได้โดยใช้เครื่องหมาย (*) แทนชื่อของคลาส

จากคลาสและ package ที่เราได้สร้างในตัวอย่างก่อนหน้า ต่อไปเราจะสร้างโปรแกรมที่จะใช้งานคลาสที่อยู่ภายใน package นั้น

// Main.java
import unit.convert.length.LengthConvert;

public class Main {
    public static void main (String[] args) {
        System.out.println("1 meter equal " + LengthConvert.meterToFeet(1) + " feets");
        System.out.println("14 meters equal " + LengthConvert.meterToFeet(14) + " feets");
        System.out.println("5 centimeter equal " + LengthConvert.centimeterToinch(5) + " inches");
    }
}

ในตัวอย่างเราได้สร้าง ไฟล์โปรแกรมหลักที่ชื่อว่า Main.java เราได้ import คลาสเข้ามาในโปรแกรมด้วยคำสั่ง

import unit.convert.length.LengthConvert;

ซึ่งทำให้เราสามารถใช้งานคลาสนี้ได้เหมือนกับมันอยู่ใน package หรือไฟล์เดียวกัน รูปภาพข้างล่างแสดงโครงสร้างของโปรเจ็คนี้

Image on Marcuscode

Info: คลาสที่ถูกสร้างใน directory root เช่นในตัวอย่าง คลาส Main.java จะถือว่าเป็น default package (หรือไม่มี package) ทำให้เราไม่ต้องกำหนด package ให้มันในตอนแรก จากบทเรียนห่อนหน้าของเรา เราสร้างใน directory root ทั้งหมด นั่นเป็นเหตุผลว่าทำไมเราจึงไม่ได้กำหนด package เหมือนคลาส LengthConvert.java

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการสร้างและใช้งาน package ในภาษา Java ซึ่งเป็นสิ่งที่ช่วยให้คุณจัดกลุ่มให้กับคลาสได้

บทความนี้เป็นประโยชน์หรือไม่?Yes·No