Method Parameters

Info

Semua file yang ada pada contoh pada catatan ini ada pada package Ch4/J4_5_Static_Method_Parameters

Ketentual call by value artinya, method hanya mengambil nilai dari parameter yang disediakan. Dilain sisi, call by reference artinya method mengambil lokasi dari variable dari parameter yang disediakan. Method dapat memodifikasi nilai yang disimpan dalam variable yang diberikan menggunakan call by reference namun tidak saat diberikan menggunakan passed by value.

Java programming language selalu menggunakan call by value. Artinyam method hanya mendapatan salinan dari semua nilai parameter. Sehingga, method tidak dapat memodifikasi konten dari parameter apapun yang diberikan.

Code

package Ch4.J4_5_Method_Parameters;

public class J_1_Call_By_Value {

    public static void main(String[] args) {

        var myWages = 10_000_000;

        doubleIt(myWages);

        // myWages still same
        System.out.printf("%,2d",myWages);
    }

    public static int doubleIt (int wages){
        x = x * 2;
        return x;
    }
}
Output
10,000,000

Implementasi apapun yang diberikan pada variable myWages, variable tersebut tidak akan pernah berubah nilainya. Jadi apa yang terjadi ?

  1. variable x pada method doubleIt diinisiasi dengan nilai salinan dari wages.
  2. Nilai x digandakan,kali 2.
  3. Method selesai, dan variable x tidak lagi digunakan.

Dengan demikian tidak terjadi perubahan apapun terhadap variable myWages.

Namun, secara garis besar, ada dua jenis tipe parameter;

  1. Primitive types (int, boolean, dsb)
  2. Object reference (refrensi ke objek)

Dari hasil diatas kita dapat melihat, tidak mungkin sebuah method merubah nilai parameter primitive type. Namun berbeda dengan object reference.

Code

package Ch4.J4_5_Method_Parameters;

public class J_2_Call_By_Value_Or_Reference_Ask {
    public static void main(String[] args) {

        var farras = new Person("Farras",12_000_000);

        System.out.println(farras);

        multipleSalary(farras);

        System.out.println(farras); // but why salary multiplied

    }

    // This parameter will get copy of value only
    public static void multipleSalary(Person p){
        p.salary = p.salary * 2;
    }
}

class Person {
    public int salary;
    private final String  name;

    public  Person(String name, int salary){
        this.name = name;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Name %s, gaji %,2d".formatted(this.name, this.salary);
    }
}
Output
Name Farras, gaji 12,000,000
Name Farras, gaji 24,000,000

Wow, mengapa salary dari person1 berubah ?

  1. p diinisiasi dengan nilai salinan dari farras, yup, yaitu refrensi ke object.
  2. method multipleSalayar di aplikasikan ke object reference. Object (instance) dari class Person yaitu p (karena mendapatkan object reference) dan farras akan mendapatkan peningkatan salary sebanyak duakali lipat.
  3. Method berakhir, parameter p tidak lagi digunakan (dihapus), dan tentu, object variable farras berlanjut terhubung ke object yang salarynya digandakan.

Jadi, dari penjelasan diatas, Java selalu passing by value masuk akal walaupun terliat seperti passing by reference.

Sebagaimana yang telah kita lihat diatas, sangat memungkinkan dan faktanya sering terjadi peng-implementasian sebuah method yang merubah state (proerties) dari sebuah objek parameter. Alasanya sangat simple. Method mendapatkan salinan dari object reference, dan keduanya, original dan copy-an merujuk pada object yang sama.

Beberapa programmer sayangnya mengklaim bahwa Java sebenarnya menggunakan call by reference untuk object. Ini SALAH. Mari kita coba menggunakan sedikit eksperiment.

Code

package Ch4.J4_5_Method_Parameters;

public class J_3_Java_Not_Use_Call_By_Reference {

    public static void main(String[] args) {
        Employee f = new Employee("Farras");
        Employee t = new Employee("Tania");

        swapEmployee(f,t);

        System.out.println("object f memiliki nama : "+f.name);
        System.out.println("object t memiliki nama : "+t.name);
    }

    public static void swapEmployee(Employee f, Employee t){
        Employee temp = f;
        f = t;
        t= temp;
        System.out.println("Copy reference object f memiliki nama : "+f.name);
        System.out.println("Copy reference object t memiliki nama : "+t.name);
    }
}

class Employee{
    public String name;
    public Employee(String name){
        this.name = name;
    }
}
Output
Copy reference object f memiliki nama : Tania
Copy reference object t memiliki nama : Farras
object f memiliki nama : Farras
object t memiliki nama : Tania

Kalau seandainya java menggunakan call by reference maka, implementasi dari hasil print.out diatas antara copy object dan original object seharsnya mengeluarkan nilai yang sama.

Ini adalah rangkuman dari apa yang dapat kita dan tidak dapat kita lakukan dengan method parameter pada Java:

  1. Sebuah method tidak dapat memodifikasi primitive type (integer atau boolean)
  2. Method dapat merubah state dari sebuah object parameter.
  3. Method tidak dapat membuat sebuah object parameter merujuk pada objek yang baru.