ฉันอ่านบทความ Singleton ใน Wikipedia และฉันพบตัวอย่างนี้:
public class Singleton {
// Private constructor prevents instantiation from other classes
private Singleton() {}
/**
* SingletonHolder is loaded on the first execution of Singleton.getInstance()
* or the first access to SingletonHolder.INSTANCE, not before.
*/
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
ในขณะที่ฉันชอบวิธีการทำงานของซิงเกิลนี้ฉันไม่เห็นวิธีการปรับให้เข้ากับการสร้างข้อโต้แย้งกับตัวสร้าง วิธีที่แนะนำในการทำเช่นนี้ใน Java คืออะไร? ฉันต้องทำอะไรแบบนี้ไหม
public class Singleton
{
private static Singleton singleton = null;
private final int x;
private Singleton(int x) {
this.x = x;
}
public synchronized static Singleton getInstance(int x) {
if(singleton == null) singleton = new Singleton(x);
return singleton;
}
}
ขอบคุณ!
แก้ไข: ฉันคิดว่าฉันเริ่มมีพายุโต้เถียงกับความปรารถนาของฉันที่จะใช้ซิงเกิล ให้ฉันอธิบายแรงจูงใจของฉันและหวังว่าใครบางคนสามารถแนะนำความคิดที่ดีกว่าได้ ฉันกำลังใช้เฟรมเวิร์กการคำนวณกริดเพื่อทำงานในแบบคู่ขนาน โดยทั่วไปแล้วฉันมีสิ่งนี้:
// AbstractTask implements Serializable
public class Task extends AbstractTask
{
private final ReferenceToReallyBigObject object;
public Task(ReferenceToReallyBigObject object)
{
this.object = object;
}
public void run()
{
// Do some stuff with the object (which is immutable).
}
}
สิ่งที่เกิดขึ้นคือแม้ว่าฉันจะผ่านการอ้างอิงไปยังข้อมูลของฉันไปที่งานทั้งหมดเมื่องานเป็นแบบอนุกรมข้อมูลจะถูกคัดลอกซ้ำไปซ้ำมา สิ่งที่ฉันต้องการจะทำคือการแบ่งปันวัตถุระหว่างงานทั้งหมด ตามธรรมชาติแล้วฉันอาจปรับเปลี่ยนคลาสได้ตามต้องการ:
// AbstractTask implements Serializable
public class Task extends AbstractTask
{
private static ReferenceToReallyBigObject object = null;
private final String filePath;
public Task(String filePath)
{
this.filePath = filePath;
}
public void run()
{
synchronized(this)
{
if(object == null)
{
ObjectReader reader = new ObjectReader(filePath);
object = reader.read();
}
}
// Do some stuff with the object (which is immutable).
}
}
อย่างที่คุณเห็นแม้ที่นี่ฉันมีปัญหาว่าการส่งพา ธ ไฟล์ที่แตกต่างหมายความว่าไม่มีอะไรหลังจากผ่านไฟล์แรก นี่คือเหตุผลที่ฉันชอบความคิดสำหรับร้านค้าที่โพสต์ในคำตอบ อย่างไรก็ตามแทนที่จะรวมถึงตรรกะสำหรับการโหลดไฟล์ในวิธีการเรียกใช้ฉันต้องการนามธรรมตรรกะนี้ลงในชั้นเรียนเดี่ยว ฉันจะไม่ให้ตัวอย่างอีก แต่ฉันหวังว่าคุณจะได้รับความคิด โปรดให้ฉันได้ยินความคิดเห็นของคุณสำหรับวิธีที่หรูหรากว่านี้เพื่อบรรลุสิ่งที่ฉันกำลังพยายามทำ ขอขอบคุณอีกครั้ง!