Pass By Reference Menggunakan Java

Okeh… ini postingan yang bermula dari chat yang dah lamaaaaaaa banget. Tapi baru sempat gw bikin tulisannya sekarang. Yeah… shame on me… 😦

Kerjaan seabrek emang mustinya gak jadi alasan. Gw ajah yang ga bisa ngatur jadwal. Tapi yah.. gitu deh, akhirnya ketulisan juga nih blog pake postingan yang sebenernya dah kadaluarsa.

Jadi… yaaa, ada lah yaaa… kenalan gw. Sebut saja si Cantik (karena ga mau disebutin identitasnya). Ceritanya si Cantik ini keukeuh ama temennya kalo yang namanya pass by reference itu mungkin banget ditulisin pake bahasa Java. Dan pendiriannya itu tepat! Sayangnya, contoh implementasi (berdasarkan pengakuan) yang dia kasih… ternyata ga secantik…. nama aliasnya (yah… nama aliasnya si Cantik, kan?).

Key… jadi… di Java emang mungkin untuk membuat sebuah mekanisme pass-by-reference layaknya bahasa pemrograman C++. Cuma caranya ajah yang beda. Kalo di C++, kan pake pengaksesan alamat menggunakan simbol ampersand (&). Sedangkan kalo di Java, cara pengaksesannya menggunakan pengiriman objek. Yah… kalo ada dari kamu yang nganggap ini bukan sebagai bentuk pass by reference, gw juga gak ngebantah. Emang sifatnya agak beda. Tapi gw punya alasan yang cukup buat berpegang teguh kenapa pengiriman objek jadi mirip sama pass by reference.

Cukup ngocehnya, jadi berikut contoh dari kode pass by value plus pass by reference make bahasa pemrograman Java.

public class X {

    int u,v;

    public X(int u, int v) {
        this.u = u;
        this.v = v;
    }

    public void passValue(int u, int v){
        u = u+10;
        v = v*10;
    }

    public void passReference(X x){
        x.u = x.u+10;
        x.v = x.v*10;
    }
}
public class Main {
public static void main(String[] args) {
X x = new X(1,2);

//Nilai u & v milik objek x sebelum pass by value
System.out.println("Pass Value\nNilai Sebelum Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);
//pemanggilan pass by value
x.passValue(x.u, x.v);

System.out.println("\nNilai Setelah Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);

//Nilai u & v milik objek x sebelum pass by reference
System.out.println("\nPass Reference\nNilai Sebelum Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);
//pemanggilan pass by value
x.passReference(x);

System.out.println("\nNilai Setelah Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);

}
}

Jadi skenario dari kode di atas, terdapat sebuah class X. Class tersebut mempunyai 2 buah fungsi (passValue untuk merepresentasikan pass by value, dan passReference untuk pass by reference). Kedua fungsi tersebut dimaksudkan untuk mengubah isi dari atribut yang dimiliki. Dan terlihat, bahwa hasil akhirnya sebagai berikut:

Pass By Reference

Terdapat perubahan nilai ketika dilakukan skenario pass by reference. Hal yang perlu diperhatikan di sini, pass by reference di Java hanya mungkin untuk dilakukan oleh pengiriman objek, dan tidak mungkin dilakukan jika menggunakan pengiriman menggunakan tipe data primitif.

Buat nambahin… gw kasih liat kalo yang namanya objek itu merupakan sebuah referensi. Hal ini yang bikin skenario di atas jadi kayak pass by reference, padahal yang diubah cuma nilai objeknya (yah…. kode di atas bisa didebat tentang pass2an itu). Jadi… gw punya skenario kode pembentukan objek dari class X yang ditulisin gini:

public class NewClass1 {
    public static void main(String[] args) {
        X x = new X(10,20);
        X y = new X(30,40);
        System.out.println("Nilai Awal");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+y.v);

        //operasi penyamaan referensi
        x = y;

        System.out.println("\nNilai Setelah Operasi x = y");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+
    }
}

Hasilnya gini:

Hasil Perubahan x=y

Kalo kamu liat2, hasilnya wajar lah ya…. Kalo x = y, maka nilai x akan ngikutin nilai y. Juga kalau ada perubahan nilai y, maka nilai x otomatis akan berubah. Wajar! Tapi… coba dibalik… kalo seandainya ada skenario gini…

        x.u=1;
        x.v=2;

        System.out.println("\nNilai Setelah Operasi Perubahan x");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+y.v);

Hasilnya bakal gini…

Nilai Perubahan X

Liat kan… kalau ada perubahan di x, ternyata nilai y juga berubah. Hal ini terjadi karena pas dilakukan operasi “x=y”, yang dilakukan si javanya, ga cuma sekedar ngubah nilai. Tapi juga penyamaan alamat. Kalo kamu masih ga percaya, coba ajah debug, lihat posisi penyimpanan masing-masing objek sebelum dan sesudah operasi “x=y”.

Begitulah… intinya, kamu bisa ngelakuin pass by reference dengan cara ngakses objek dari class terkait… dan hal yang sama gak akan kamu dapatkan dengan ngakses variabel dengan tipe data primitif biasa.

Walo penjelasannya belepotan, moga ngebantu yah… terutama buat si *******… eh, si Cantik… 😀

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s