Access Modifiers

ในบทนี้ เราจะพูดเกี่ยวกับ Access Modifiers ในภาษา Java ซึ่งเป็นคำสั่งที่ใช้กำหนดการเข้าถึงในโปรแกรม

Access Modifiers เป็นคำสั่งในการควบคุมระดับการเข้าถึงของตัวแปรหรือเมธอดที่อยู่ภายในคลาส เหมือนที่คุณได้เห็นในการสร้างคลาสหลัก ชื่อของคลาสและไฟล์ต้องตรงกัน และต้องกำหนดการเข้าถึงให้เป็นแบบ public ซึ่งทำให้คลาสนี้สามารถเข้าถึงได้จากที่ทุกของโปรแกรม นอกจากนี้ Access Modifiers ยังเป็นคำสั่งที่ใช้ในการกำหนดการเข้าถึงของออบเจ็คต่างๆ ใน Package เช่น คลาส และ Interfaces เป็นต้น

ต่อมาเราจะมาพูดถึงระดับสมาชิก (member level) ซึ่งมันจะมาพร้อมกับการกระกาศตัวแปรที่คุณเคยเห็นในตัวอย่างก่อนหน้าแล้ว เช่น

private int width;
private int height;

public int calArea () {
return width * height;
}

ในภาษา Java นั้นมีคำสั่งในการควบคุมระดับการเข้าถึงอยุ่ 4 ระดับด้วยกัน คือ public, protected, private และ no modifier (ไม่ต้องกำหนด) โดยแต่ละรูปแบบนั้นมีความหมายดังนี้

  • public: คลาสหรือสมาชิกสามารถเข้าถึงได้จากที่ส่วนของโปรแกรม
  • protected: คลาสหรือสมาชิกสามารถเข้าถึงได้ภายใน package เดียวกันและ sub class ของมัน
  • no modifier (ไม่กำหนด): คลาสหรือสมาชิกสามารถเข้าถึงได้ภายใน package เดียวกัน และภายในคลาสเดียวกันเท่านั้น
  • private: คลาสหรือสมาชิกสามารถเข้าถึงได้ภายในคลาสเดียวกันเท่านั้น

จากคำอธิบายข้างบน เราสามารถนำมาเขียนเป็นตารางการเข้าถึงของคำสั่งทั้งหมดได้ดังนี้ โดยที่ public เป็นการเข้าถึงที่เป็นสาธารณะมากที่สุด และ private นั้นปิดกั้นที่สุด

ModifiersClassPackageSub classWorld
publicYesYesYesYes
protectedYesYesYesNo
no modifierYesYesNoNo
privateYesNoNoNo

ต่อไปมาดูตัวอย่างการใช้งาน Access Modifier กับการเขียนโปรแกรมในภาษา Java

public class TestFruit {
public static void main (String[] args) {
Fruit fr = new Fruit();
fr.name = "Grape";
fr.flavor = "sour";
fr.setColor("green");

System.out.println("Fruit name: " + fr.name);
System.out.println("Flavor: " + fr.flavor);
System.out.println("Color: " + fr.getColor());
}
}

class Fruit {
public String name;
String flavor;
private String color;

public String getColor () {
return color;
}
public void setColor (String c) {
color = c;
}
}

ในตัวอย่าง เป็นการใช้ access modifier แบบต่างๆ ในตอนแรก เราได้สร้างคลาส Fruit ที่มีสมาชิกทั้งตัวแปรและเมธอดที่มีระดับการเข้าถึงในแบบต่างๆ

Fruit fr = new Fruit();
fr.name = "Grape";
fr.flavor = "sour";
fr.setColor("green");

ต่อมาเราสร้างออบเจ็ค Fruit ที่มีชื่อว่า fr โดยคุณสังเกตุว่าออบเจ็คที่เราสร้างนั้นอยู่ในคลาส TestFruit นั่นหมายความว่าเราไม่สามารถเข้าถึงตัวแปร color ได้ เพราะมันมี access modifier แบบ private ซึ่งสามารถเข้าถึงได้ภายในคลาสเท่านั้น เราจึงเข้าถึงมันผ่าน public เมธอด getColor () และ setColor () ซึ่งอยู่ภายในคลาสเดียวกัน

สำหรับตัวแปร name และ flavor เราสามารถเข้าถึงได้ผ่านตัวแปรออบเจ็คโดยตรง เพราะพวกเขามี access modifier เป็นแบบ public ซึ่งสามารถเข้าถึงจากภายนอกได้

Fruit name: Grape
Flavor: sour
Color: green

และนี่เป็นผลลัพธ์ของโปรแกรม

การเข้าถึงแบบ Public

ต่อไปเป็นตัวอย่างเพิ่มเติมในการใช้ Access modifiers รูปแบบต่างๆ ในการกำหนดการเข้าถึงของโปรแกรมภายในคลาส โดยเราจะเริ่มกับคำสั่ง public ซึ่งเป็นการกำหนดการเข้าถึงแบบสาธารณะ

class Person {

public String firstName;
public String lastName;
protected int age;
private int height;

public String getFullname() {
return firstName + " " + lastName;
}

public void setHeight(int h) {
height = h;
}

public int getHeight() {
return height;
}

}

public class PublicExample {
public static void main(String[] args) {

Person p1 = new Person();
p1.firstName = "Shawn";
p1.lastName = "Roberts";
p1.age = 32;
p1.setHeight(178);

System.out.println(p1.getFullname());
System.out.println("Age " + p1.age + " years");
System.out.println("Height " + (p1.getHeight() / 100.0f) + " m");

}
}

ในตัวอย่าง เราได้สร้างคลาส Person สำหรับเก็บข้อมูลของบุคคล ที่ประกอบไปด้วยตัวแปร firstName และ lastName ที่มีการกำหนดการเข้าถึงเป็นแบบ public และเมธอดภายในคลาสนั้นเป็นแบบ public ทั้งหมด จึ่งทำให้พวกมันสามารถเข้าถึงผ่านออบเจ็คได้ เช่น p1.firstName เป็นต้น

การเข้าถึงแบบ Protected และ Private

ต่อไปเป็นการใช้งานตัวแปร age ซึ่งมีการกำหนดการเข้าถึงแบบ protected การกำหนดการเข้าถึงแบบนี้ใช้กับการใช้งานในการสืบทอดของคลาส เมื่อคุณได้ทำการสืบทอดคลาสใดๆ สมาชิกทั้งหมดของคลาสยกเว้นที่มีการกหนดการเข้าถึงเป็นแบบ Private จะไม่ถูกสืบทอด ดังนั้นในตัวอย่างเราไม่สามารถเข้าถึงสมาชิกที่เป็น Private ผ่านตัวแปรออบเจ็ค p1 ได้

Shawn Roberts
Age 32 years
Height 1.78 m

นี่เป็นผลลัพธ์การทำงานของโปรแกรม ในการกำหนดการเข้าถึงของโปรแกรม

ในบทนี้ คุณได้เรียนรู้กับ access modifier แบบต่างๆ ในภาษา Java ซึ่งจะมีการกำหนดการเข้าถึงตัวแปรในระดับที่ต่างกัน โดยเนื้อหาในบทนี้นั้นสำคัญกับแนวคิดในการทำ Encapsulation (การห่อหุ้มข้อมูล)


บทความเกี่ยวกับ Access Modifiers