มีอะไรผิดปกติกับการเรียนแบบคงที่แท้จริงเป็นแบบคงที่ กล่าวคือไม่มีสถานะภายในที่จะพูดถึงซึ่งจะทำให้ผลลัพธ์ของวิธีการเปลี่ยนแปลง
หากDice.roll()
เพียงแค่ส่งกลับหมายเลขสุ่มใหม่จาก 1 ถึง 6 ก็จะไม่เปลี่ยนสถานะ จริงอยู่ที่คุณอาจจะแบ่งปันRandom
อินสแตนซ์ แต่ฉันไม่คิดว่าการเปลี่ยนแปลงของรัฐตามคำนิยามผลลัพธ์จะเป็นไปได้เสมอโดยการสุ่ม นอกจากนี้ยังเป็นเธรดที่ปลอดภัยดังนั้นจึงไม่มีปัญหาที่นี่
คุณมักจะเห็น "Helper" ขั้นสุดท้ายหรือคลาสยูทิลิตี้อื่น ๆ ที่มี Constructor ส่วนตัวและสมาชิกแบบสแตติก คอนสตรัคส่วนตัวไม่มีตรรกะและทำหน้าที่เพียงเพื่อป้องกันไม่ให้ใครบางคนจากชั้นเรียน instantiating ตัวปรับเปลี่ยนขั้นสุดท้ายจะนำความคิดนี้กลับบ้านซึ่งไม่ใช่ชั้นเรียนที่คุณต้องการได้รับมา มันเป็นเพียงคลาสยูทิลิตี้ หากทำอย่างถูกต้องไม่ควรมีซิงเกิลตันหรือสมาชิกชั้นเรียนอื่นที่ไม่ได้เป็นตัวเองและอยู่ในขั้นสุดท้าย
ตราบใดที่คุณปฏิบัติตามแนวทางเหล่านี้และคุณไม่ได้ทำซิงเกิลตันก็ไม่มีอะไรผิดปกติกับเรื่องนี้ คุณพูดถึงคลาสคอนโทรลเลอร์และเกือบจะต้องมีการเปลี่ยนแปลงสถานะดังนั้นฉันจะแนะนำให้ใช้วิธีคงที่เท่านั้น คุณสามารถพึ่งพาคลาสยูทิลิตี้แบบคงที่ได้ แต่คุณไม่สามารถทำให้เป็นคลาสยูทิลิตี้แบบคงที่ได้
การเปลี่ยนแปลงสถานะสำหรับชั้นเรียนคืออะไร? ทีนี้, ลองแยกตัวเลขสุ่ม ๆ หนึ่งวินาที, เพราะมันเป็น nondeterministic โดยนิยาม, ดังนั้นค่าที่ส่งคืนจะเปลี่ยนบ่อยๆ
ฟังก์ชั่นที่บริสุทธิ์คือสิ่งที่กำหนดไว้ซึ่งจะกล่าวสำหรับอินพุตที่กำหนดคุณจะได้รับหนึ่งและหนึ่งเอาต์พุตที่แน่นอน คุณต้องการให้วิธีการแบบคงที่เป็นฟังก์ชั่นที่บริสุทธิ์ ใน Java มีวิธีการปรับพฤติกรรมของวิธีการคงที่เพื่อรักษาสถานะ แต่พวกเขาเกือบจะไม่เคยคิดที่ดี เมื่อคุณประกาศเมธอดเป็นแบบคงที่โปรแกรมเมอร์ทั่วไปจะสมมติทันทีว่าค้างคาวเป็นฟังก์ชันที่บริสุทธิ์ การเบี่ยงเบนจากพฤติกรรมที่คาดหวังคือวิธีที่คุณมักจะสร้างข้อบกพร่องในโปรแกรมของคุณโดยทั่วไปแล้วการพูดและควรหลีกเลี่ยง
ซิงเกิลตันเป็นคลาสที่มีวิธีการคงที่เกี่ยวกับตรงข้ามกับ "ฟังก์ชั่นบริสุทธิ์" เท่าที่คุณสามารถ สมาชิกส่วนตัวคงเดียวจะถูกเก็บไว้ภายในชั้นเรียนซึ่งจะใช้เพื่อให้แน่ใจว่ามีอินสแตนซ์เดียว นี่ไม่ใช่วิธีปฏิบัติที่ดีที่สุดและอาจทำให้คุณมีปัญหาในภายหลังด้วยเหตุผลหลายประการ หากต้องการทราบสิ่งที่เรากำลังพูดถึงนี่เป็นตัวอย่างง่ายๆของซิงเกิลตัน:
// DON'T DO THIS!
class Singleton {
private String name;
private static Singleton instance = null;
private Singleton(String name) {
this.name = name;
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton("George");
}
return instance;
}
public getName() {
return name;
}
}
assert Singleton.getInstance().getName() == "George"