pass by value လား pass by reference လား

Java က pass by value လား၊ pass by reference လားလို့ မေးရင် pass by value ကအဖြေမှန်ဖြစ်တယ်ဆိုတာ သိကြတယ်။ ဒါပေမယ့် beginner တွေခေါင်းရှုပ်နိုင်တဲ့အချက်က Object တွေကို function ထဲထည့်ခေါ်ပြီး function ကအဲဒီ input ကို mutate လုပ်လိုက်တဲ့အခါ caller ဖက်မှာပါ လိုက်ပြောင်းသွားတာကို မြင်ရတာပါပဲ။

ဥပမာ

Book harryPotter = new Book("Harry Potter");
renameBook(harryPotter, "Star Wars");

ပထမတကြောင်းက Harry Potter လို့ခေါ်တဲ့ Book object ကိုဆောက်ပါတယ်။ ဒုတိယတကြောင်းမှာ Book ကိုနာမည်ချိန်းမယ့် function ကို ခေါ်ပါတယ်။ တကယ်လို့ အဲနောက်မှာ harryPotter ရဲ့ name ကို ကျွန်တော်တို့ print ထုတ်ကြည့်ရင် Star Wars ဖြစ်သွားပြီဆိုတာ တွေ့ရမယ်။ ဒါပေမယ့် အဲဒီလိုဖြစ်ရတာက runtime က renameBook() ထဲ harryPotter ရဲ့ reference ထည့်ပေးလိုက်လို့ မဟုတ်ပါဘူး။

Java နဲ့ တခြား JVM language တွေမှာ Object ကို pointer အဖြစ် implement လုပ်ထားကြတယ်။ ဒါကြောင့် Java ရဲ့ Object type variable တွေက size တူ pointer တွေဖြစ်ကြတယ်။

အပေါ်က ဥပမာမှာဆိုရင် harryPotter က pointer တခုပဲဖြစ်တယ်။ အဲဒီ pointer က ပြန်ညွှန်းနေမယ့်အရာကသာ Book object တခုဖြစ်မယ်လို့ Java က အာမခံတယ်။ ဒါကြောင့် pass by value လုပ်တဲ့အခါ renameBook() ထဲပါသွားတာက harryPotter ရဲ့ pointer ဖြစ်တယ်။ pointer ကို dereference လုပ်ပြီး name အသစ် ချိန်းလိုက်တဲ့အခါ မူလ Book object ဖြစ်တဲ့ harryPotter ကိုပါ သက်ရောက်သွားစေတယ်။

Java မှာ primitive type ကလွဲရင် ကျန်တာတွေက Object တွေဖြစ်တယ်။ အဲဒီ Object တွေက heap memory ပေါ်ရှိကြတယ်။ အဲဒါကြောင့် JVM ရဲ့ GC (garbage collector) က struct ကို support တဲ့ programming language တွေ ဥပမာ Swift, Go တို့ထက်စာရင် ပိုအလုပ်လုပ်ရပါတယ်။ GC ဆိုတာက C, C++ မှာလို memory deallocation ကို လူကိုယ်တိုင်လုပ်ဖို့ မလိုအောင် မသုံးတော့တဲ့ unused object တွေကို automatic free-up လိုက်လုပ်ပေးတဲ့ program ကိုခေါ်တယ်။

Go မှာဆိုရင် struct တခုက local variable ဖြစ်တယ်။ သူ့ရဲ့ pointer ကိုလည်း parent ဆီ return မလုပ်ဘူး။ struct size ကိုလည်း compilation phase မှာကြိုသိနိုင်မယ်ဆိုရင် အဲဒီ struct ကို stack ပေါ်ဆောက်လို့ရပါတယ်။ ဒီပုံစံက heap နဲ့ GC ကို သိသိသာသာ တာဝန်နည်းစေတယ်။ ဒါပေမယ့် Go ကလည်း pass by value ဖြစ်တာမို့ pointer နဲ့ခေါ်ပြီး mutation လုပ်ဖို့ ရည်ရွယ်တယ်ဆိုရင် ကိုယ့် API ကို ရှင်းရှင်းလင်းလင်း documentation ရေးထားသင့်ပါတယ်။ ဒီ detail လေးတွေသိထားရင် program ရေးတဲ့အခါ magic တွေကြုံရနည်းသွားမယ်လို့ မျှော်လင့်ပါတယ်ခင်ဗျာ။