วัตถุที่เปลี่ยนแปลงได้/ไม่เปลี่ยนรูปคืออะไร และมีไว้เพื่ออะไร  - 1

“สวัสดี อามีโก้!”

"สวัสดี บิลาโบ!"

"วันนี้ Bilaabo จะบอกคุณเกี่ยวกับวัตถุที่เปลี่ยนแปลงได้และไม่เปลี่ยนรูป

"อ็อบเจกต์ที่คุณสามารถเปลี่ยนแปลงได้หลังจากสร้างขึ้นเรียกว่าmutable "

"ออบเจกต์ที่ไม่สามารถเปลี่ยนแปลงได้หลังจากสร้างแล้วเรียกว่าไม่เปลี่ยนรูปแบบ "

"อะไรเป็นตัวกำหนดว่าฉันสามารถเปลี่ยนวัตถุได้หรือไม่"

"ผู้เขียนคลาสใหม่สามารถทำให้ออบเจกต์ของคลาสนั้นไม่เปลี่ยนรูปแบบได้ ตัวอย่างเช่น หากคุณทำให้ setters ทั้งหมดเป็นแบบส่วนตัว วัตถุจะมีเพียงตัวสร้างและตัวรับเท่านั้น ซึ่งหมายความว่าจะไม่สามารถเปลี่ยนแปลงได้หลังจากสร้างแล้ว "

"แล้วนั่นจะมีประโยชน์อะไร"

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

1) วัตถุที่ไม่เปลี่ยนรูปนั้นง่ายต่อการใช้งานมากกว่าวัตถุที่ไม่เปลี่ยนรูป

2) วัตถุที่ไม่เปลี่ยนรูปแบบสามารถใช้ได้อย่างอิสระในหลาย ๆ เธรดพร้อมกัน

"เมื่อนักพัฒนาตัดสินใจที่จะเขียนคลาสที่ไม่เปลี่ยนรูป เขามักจะสร้างทั้งเวอร์ชันที่เปลี่ยนรูปได้และไม่เปลี่ยนรูปของคลาส"

"แต่จุดประสงค์ของการเขียนสองชั้นเรียนแทนที่จะเป็นหนึ่ง"

"บางครั้งมันก็คุ้มค่าเมื่อเวอร์ชันที่ไม่เปลี่ยนรูปของอ็อบเจ็กต์จะง่ายกว่า/เร็วกว่าเวอร์ชันที่ไม่เปลี่ยนรูปมาก ดังนั้นพวกเขาจึงสร้างสองเวอร์ชัน มันเหมือนกับ ArrayList และ LinkedList ทั้งคู่เป็นรายการ แต่อันหนึ่งได้รับการปรับให้เหมาะสมสำหรับวัตถุประสงค์เฉพาะ และครั้งที่สองสำหรับคนอื่น ๆ "

"นั่นสมเหตุสมผลมากขึ้นแล้ว"

"นอกจากนี้ยังมีคลาสที่ไม่เปลี่ยนรูปล้วน ซึ่งไม่มีเวอร์ชันที่เปลี่ยนรูปได้"

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

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

"นี่คือตัวอย่างบางส่วน:"

รหัสจาวา คำอธิบาย
String s = "london";
String s2 = s.toUpperCase();
เป็นผลให้ s มีสตริง «london» และ s2 มี «LONDON»
Integer i = 1;
Integer j = i;
j++;
นี่คือสิ่งที่เกิดขึ้นจริง:
จำนวนเต็ม i = จำนวนเต็มใหม่ (1);
จำนวนเต็ม j = i;
j = จำนวนเต็มใหม่ (i.getInt ()+1);

"คลาส String เป็นคลาสที่ไม่เปลี่ยนรูป อ็อบเจกต์สตริงทั้งหมดเปลี่ยนรูปไม่ได้ แต่นั่นไม่ได้ทำให้เราไม่สามารถทำงานกับมันได้ ตัวอย่างเช่น เมธอด toUpperCase () ของคลาส String จะแปลงสตริงเป็นตัวพิมพ์ใหญ่ (เช่น แทนที่ตัวอักษรขนาดเล็กทั้งหมด ด้วยตัวพิมพ์ใหญ่) อย่างไรก็ตามวิธีการนี้ไม่ได้เปลี่ยนตัว String เองแต่จะคืนค่า String ใหม่แทน ซึ่ง String ใหม่นี้จะเหมือนกันกับตัวแรก ยกเว้นอักขระทั้งหมดจะเป็นตัวพิมพ์ใหญ่ (ตัวพิมพ์ใหญ่)"

"คลาส Integer ยังเป็นคลาสที่ไม่เปลี่ยนรูป อ็อบเจ็กต์ Integer ทั้งหมดไม่เปลี่ยนรูป ทุกครั้งที่เราเปลี่ยนอ็อบเจกต์ Integer เรากำลังสร้างอ็อบเจกต์ใหม่"

"น่าสนใจจัง! ไชโย บิลาโบ"

"ไชโยสำหรับฉันไชโยสำหรับ Bilaabo!"