ตอนแรกที่เจอก็งงๆ ว่า String immutable ยังไง และอะไรคือ Immutable pattern แล้วก็เลยไปค้นเพิ่มเติมมาImmutable pattern เป็น pattern ที่สร้างขึ้นเพื่อให้ วัตถุ ไม่มีการเปลี่ยนค่า หลังจากสร้างขึ้นมา สำหรับจาวาแล้ว วิธีการที่จะทำแบบนี้ก็ง่ายมาก ใน คลาส กำหนด final ที่ property แล้วสร้าง constructor สำหรับการเก็บค่าที่กำหนดเท่านั้นก็เรียบร้อย เออมันง่ายแฮะ แล้วทำไม String ถึงต้องใช้ pattern แบบนี้หละ งั้นมาดูข้อดีของ Immutable pattern ดีกว่า
- วัตถุที่สร้างจาก pattern นี้เมื่อถูกส่งไปยังคลาสอื่นๆ แล้วไม่ต้องกลัวเลยว่า คลาสนั้นจะแก้ไขค่าในวัตถุ
- เนื่องจาก ไม่ต้องป้องกันการ copy ค่า ดังนั้น garbage collector ก็ทำงานน้อยลง ประสิทธิภาพก็ดีขึ้น นอกจากนี้ยังลดการใช้เนื้อที่ในหน่วยความจำด้วย
- การทำงาน ที่เกี่ยวข้องกับ concurency ง่ายขึ้น เนื่องจากวัตถุที่สร้างขึ้นจะไม่มีการเปลี่ยนค่าอีก จึงไม่จำเป็นต้องกังวลเกี่ยวกับ การเข้าถึงข้อมูลและแก้ไขค่า ของแต่ละ Thread
อืม ข้อดีเยอะแฮะ เอ๊ะ แล้ว String มัน Immutable ยังไงงั้นมาดูกันดีกว่า
String s = "Hello, world";
s = "How are you?";
จาก ด้านบน เอ๊ะ มันก็มีการเปลี่ยนค่านี่หว่า แล้วมันป้องกันการเปลี่ยนค่ายังไง แต่จริงๆ แล้ว ตัววัตถุไม่ได้มีการเปลี่ยนค่าเลย แต่เป็นการสร้าง วัตถุใหม่ขึ้นมาต่างหาก เพียงแต่ตำแหน่งที่ชี้ของ s เท่านั้น ถ้ายังงง ก็ต้องเล่าถึงการส่งค่าตัวแปรของจาวาก่อน
ใน จาวาการส่งค่าตัวแปรมีสองแบบ คือ pass-by-value และ pass-by-reference ถ้าเป็นตัวแปรทั่วๆ ไปเช่น int, double, float ไรเทือกนี้ การส่งค่าต่างๆ จะเป็น pass-by-value แต่ถ้าเป็น วัตถุ จะ pass-by-reference แทน และ String ก็ถือว่าเป็นวัตถุ ไม่ได้เป็น ตัวแปรประเภทพื้นฐาน ดังนั้น หากมีการส่งค่า String อะไรก็ตามไปยัง function หรือ method ต่างๆ จะเป็น pass-by-reference หมด ลองมาดู code ถัดไป
class Foo {
void changeString(String inside) {
inside.append(" world") ; // pretend this changes the String...
}
}
public class Main {
public static void main(String args...) {
String s = "hello" ;
Foo f = new Foo( ) ;
f.changeString(s) ;
System.out.println(s) ; // ...then this would be "hello world"...
f.changeString("strange") ; // ...and what happens here?!
}
}
เนื่องจากจาวา String สามารถสร้างโดยใช้เครื่องหมาย “(double quote) ได้ จาก code ด้านบนที่บรรทัดสุดท้าย จะเกิดอะไรขึ้นถ้าหากสร้าง String จาก “” จึงกำหนด ให้ String immutable เพื่อให้การส่งค่าต่างๆ เปลี่ยนจาก copy-by-reference เป็น copy-by-value แทน
โอ้วยาวแฮะ สำหรับแหล่งข้อมูลจริงๆ ก็เขียนไปในโพสท์ก่อนหน้านี้แล้ว แต่เขียนเพิ่มในนี้ด้วยละกัน
- http://www.acooke.org/andrew/immutable.html
- http://forum.java.sun.com/thread.jspa?threadID=607354&messageID=3307207
- http://www.javalobby.org/articles/immutable/index.jsp
- http://www.developer.com/java/other/article.php/10936_617931_1
ปอลอ. ใครอ่านแล้วสับสนก็กดตาม link ไปดีกว่า เพราะว่าจริงๆ แล้วจะจดไว้กันลืมง่ะ