0Pricing
Java Academy · บทเรียน

EnumSet

การดำเนินการเซตบนอีนัมอย่างรวดเร็ว

EnumSet เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

EnumSet คืออะไร

EnumSet เป็นการใช้งาน Set เฉพาะทางสำหรับชนิดอีนัมเท่านั้น

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

import java.util.EnumSet;
import java.util.Set;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        Set<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
        System.out.println(weekend);
    }
}

การสร้างด้วย of

เมธอดโรงงาน EnumSet.of(...) จะสร้างเซตจากค่าคงที่ที่ระบุ มีเมธอดหลายรูปแบบสำหรับองค์ประกอบตั้งแต่หนึ่งถึงห้าตัว รวมถึงรุ่นที่รับอาร์กิวเมนต์แปรผัน

import java.util.EnumSet;

public class Main {
    enum Perm { READ, WRITE, EXECUTE }
    public static void main(String[] args) {
        EnumSet<Perm> perms = EnumSet.of(Perm.READ, Perm.WRITE);
        System.out.println(perms);
    }
}

allOf และ noneOf

เมธอดโรงงานเพิ่มเติมอีกสองตัว:

  • allOf(Type.class) สร้างเซตที่มีค่าคงที่ทุกตัว
  • noneOf(Type.class) สร้างเซตว่างที่พร้อมเติมสมาชิก
import java.util.EnumSet;

public class Main {
    enum Color { RED, GREEN, BLUE }
    public static void main(String[] args) {
        EnumSet<Color> all = EnumSet.allOf(Color.class);
        EnumSet<Color> none = EnumSet.noneOf(Color.class);
        none.add(Color.RED);
        System.out.println("all: " + all);
        System.out.println("built: " + none);
    }
}

range สำหรับค่าคงที่ที่ต่อเนื่อง

EnumSet.range(from, to) รวมค่าคงที่ทั้งหมดระหว่างจุดเริ่มต้นและจุดสิ้นสุด โดยรวมทั้งสองจุดและเรียงตามลำดับการประกาศ

import java.util.EnumSet;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        EnumSet<Day> workdays = EnumSet.range(Day.MON, Day.FRI);
        System.out.println(workdays);
    }
}

complementOf

EnumSet.complementOf(set) จะส่งคืนเซตของค่าคงที่ทั้งหมดที่ไม่อยู่ในเซตที่กำหนด

นี่เป็นวิธีที่รวดเร็วในการกลับด้านการเลือก

import java.util.EnumSet;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        EnumSet<Day> work = EnumSet.range(Day.MON, Day.FRI);
        EnumSet<Day> rest = EnumSet.complementOf(work);
        System.out.println(rest);
    }
}

การดำเนินการกับเซต

เนื่องจาก EnumSet เป็น Set จริง คุณจึงสามารถหายูเนียน อินเตอร์เซกชัน และผลต่างผ่าน addAll, retainAll และ removeAll ได้

ภายใน การดำเนินการเหล่านี้ทำงานด้วยการดำเนินการระดับบิตที่รวดเร็ว

import java.util.EnumSet;

public class Main {
    enum Tag { A, B, C, D }
    public static void main(String[] args) {
        EnumSet<Tag> x = EnumSet.of(Tag.A, Tag.B, Tag.C);
        EnumSet<Tag> y = EnumSet.of(Tag.B, Tag.C, Tag.D);
        EnumSet<Tag> inter = EnumSet.copyOf(x);
        inter.retainAll(y);
        System.out.println("intersection: " + inter);
    }
}

การตรวจสอบสมาชิก

contains เป็นการตรวจสอบบิตเพียงครั้งเดียว จึงใช้เวลาแบบคงที่และทำงานได้รวดเร็วมาก

import java.util.EnumSet;

public class Main {
    enum Feature { DARK_MODE, BETA, ANALYTICS }
    public static void main(String[] args) {
        EnumSet<Feature> enabled = EnumSet.of(Feature.DARK_MODE, Feature.BETA);
        System.out.println(enabled.contains(Feature.BETA));
        System.out.println(enabled.contains(Feature.ANALYTICS));
    }
}

EnumSet ในฐานะสิ่งทดแทนแฟล็ก

ก่อนมี EnumSet โปรแกรมเมอร์ใช้แฟล็กบิตของ int เช่น READ | WRITE EnumSet เข้ามาแทนที่ด้วยความปลอดภัยด้านชนิดข้อมูลและความอ่านง่าย

คุณจะได้ประสิทธิภาพของฟิลด์บิตโดยไม่ต้องจัดการมาสก์ด้วยตนเอง ซึ่งเสี่ยงต่อข้อผิดพลาด

import java.util.EnumSet;
import java.util.Set;

public class Main {
    enum Style { BOLD, ITALIC, UNDERLINE }
    static void render(Set<Style> styles) {
        System.out.println("Applying: " + styles);
    }
    public static void main(String[] args) {
        render(EnumSet.of(Style.BOLD, Style.UNDERLINE));
    }
}

การวนซ้ำตามลำดับการประกาศ

EnumSet วนซ้ำค่าคงที่ตามลำดับธรรมชาติ ซึ่งก็คือลำดับการประกาศ

ทำให้ลำดับการวนซ้ำคาดเดาได้และคงที่ แตกต่างจาก HashSet

import java.util.EnumSet;

public class Main {
    enum Phase { ALPHA, BETA, RC, GA }
    public static void main(String[] args) {
        EnumSet<Phase> set = EnumSet.of(Phase.GA, Phase.ALPHA, Phase.RC);
        for (Phase p : set) System.out.println(p);
    }
}

การทำสำเนาเพื่อป้องกันด้วย copyOf

EnumSet.copyOf(collection) สร้าง EnumSet จากคอลเลกชันใด ๆ ที่มีค่าอีนัม ใช้เพื่อสร้างสำเนาที่ปลอดภัยหรือแปลง List ได้

import java.util.EnumSet;
import java.util.List;

public class Main {
    enum Role { ADMIN, EDITOR, VIEWER }
    public static void main(String[] args) {
        List<Role> source = List.of(Role.EDITOR, Role.VIEWER);
        EnumSet<Role> roles = EnumSet.copyOf(source);
        System.out.println(roles);
    }
}

เหตุผลที่ทำงานได้รวดเร็ว

สำหรับอีนัมที่มีค่าคงที่ไม่เกิน 64 ตัว EnumSet จะใช้ long เพียงตัวเดียวเป็นเวกเตอร์บิต การดำเนินการแต่ละครั้งใช้คำสั่งระดับเครื่องเพียงหนึ่งหรือสองคำสั่ง

ควรเลือกใช้ EnumSet แทน HashSet<MyEnum> สำหรับเซตอีนัมเสมอ

import java.util.EnumSet;

public class Main {
    enum Bit { B0, B1, B2, B3 }
    public static void main(String[] args) {
        EnumSet<Bit> s = EnumSet.of(Bit.B0, Bit.B2);
        // contains is a single bit-and under the hood
        System.out.println(s.contains(Bit.B2));
    }
}

ตรวจสอบความเข้าใจ

ทดสอบความรู้ของคุณเกี่ยวกับ EnumSet

ทบทวน

คุณได้เรียนรู้เรื่อง EnumSet:

  • Set แบบเวกเตอร์บิตสำหรับอีนัม ซึ่งทำงานได้รวดเร็วและใช้พื้นที่น้อย
  • เมธอดโรงงาน: of, allOf, noneOf, range, complementOf, copyOf
  • วนซ้ำตามลำดับการประกาศ
  • สิ่งทดแทนแฟล็กบิตของ int ที่ปลอดภัยด้านชนิดข้อมูล

ถัดไป พบกับชนิดแมปที่สอดคล้องกัน: EnumMap

import java.util.EnumSet;

public class Main {
    enum X { A, B }
    public static void main(String[] args) {
        System.out.println("EnumSet recap: " + EnumSet.allOf(X.class));
    }
}

คำถามที่พบบ่อย

บทเรียน “EnumSet” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “EnumSet” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “EnumSet”

การดำเนินการเซตบนอีนัมอย่างรวดเร็ว คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “EnumSet” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. อีนัมที่มีฟิลด์และเมธอด
  2. เมธอดนามธรรมในอีนัม
  3. EnumSet
  4. EnumMap
← กลับไปที่ Java Academy