แนวทางที่ดีที่สุดในการใช้ Enum เป็นซิงเกิลตันใน Java คืออะไร?


85

จากสิ่งที่เขียนในคำถาม SO Best Singleton Implementation In Java - คือเกี่ยวกับการใช้ enum เพื่อสร้าง singleton - อะไรคือความแตกต่าง / ข้อดี / ข้อเสียระหว่าง (ตัวสร้างละเว้น)

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

แล้วโทร Elvis.INSTANCE.getAge()

และ

public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}

แล้วโทร Elvis.getAge()

คำตอบ:


96

สมมติว่าคุณผูกมัดกับบางสิ่งที่จะใช้คุณสมบัติของวัตถุใด ๆ ที่มอบให้ - คุณสามารถผ่าน Elvis.INSTANCE ได้อย่างง่ายดาย แต่คุณไม่สามารถผ่าน Elvis.class และคาดหวังว่ามันจะพบคุณสมบัติ (เว้นแต่จะมีการเข้ารหัสโดยเจตนาเพื่อค้นหา คุณสมบัติคงที่ของคลาส)

โดยทั่วไปคุณจะใช้รูปแบบซิงเกิลตันเมื่อคุณต้องการอินสแตนซ์เท่านั้น หากวิธีการคงที่ใช้ได้ผลสำหรับคุณให้ใช้วิธีเหล่านี้และไม่ต้องกังวลกับ enum


1
ทำไมไม่รำคาญกับ enum? มีวิธีที่ดีกว่าในการทำ singeltons ใน java5 + หรือไม่?
jontro

4
@jontro (re) อ่านคำตอบ; เขาบอกว่าให้ใช้ enums เมื่อคุณต้องมีซิงเกิลตัน แต่เพื่อหลีกเลี่ยงซิงเกิลตันหากคุณสามารถทำได้ด้วยวิธีการคงที่
ตัวแปร

@MiserableVariable ฉันแสดงความคิดเห็นเกี่ยวกับเรื่องนี้เมื่อปีที่แล้ว จำไม่ได้จริงๆว่าบริบทที่ฉันอ้างถึงคืออะไร
jontro

ไม่ตอบคำถามที่ถาม
Thufir

2
@ Thufir: มันตอบโจทย์ส่วน "อะไรคือความแตกต่าง" - ซึ่งดูเหมือนจะเป็นสิ่งที่ OP ให้ความสนใจมากที่สุดเนื่องจากคำตอบนั้นได้รับการยอมรับ
Jon Skeet

69

ข้อดีอย่างมากคือเมื่อซิงเกิลตันของคุณต้องใช้อินเทอร์เฟซ ทำตามตัวอย่างของคุณ:

public enum Elvis implements HasAge {
    INSTANCE;
    private int age;

    @Override
    public int getAge() {
        return age;
    }
}

ด้วย:

public interface HasAge {
    public int getAge();
}

มันไม่สามารถทำได้ด้วยสถิต ...


1
สามารถทำได้ด้วยสถิตยศาสตร์ ... public static final HasAge INSTANCE = new HasAge () {private int age; @Override public int getAge () {อายุย้อนกลับ; }}; ... ดังนั้นฉันยังคงสงสัยว่าอะไรคือสิ่งที่ดีหรือดีกว่าเกี่ยวกับวิธี enum ฉันคิดว่าถ้าคุณต้องการใช้สองอินเทอร์เฟซ?
Sean Adkinson

9

(Stateful) โดยทั่วไปจะใช้ Singletons เพื่อแสร้งทำเป็นไม่ใช้ตัวแปรคงที่ หากคุณไม่ได้ใช้ตัวแปรคงที่แบบสาธารณะจริงๆคุณจะหลอกคนได้น้อยลง


8

ฉันจะเลือกตัวเลือกที่ง่ายและชัดเจนที่สุด นี่เป็นเรื่องส่วนตัว แต่ถ้าคุณไม่รู้ว่าอะไรชัดเจนที่สุดให้เลือกตัวเลือกที่สั้นที่สุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.