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
Implementasi apapun yang diberikan pada variable myWages
, variable tersebut tidak akan pernah berubah nilainya. Jadi apa yang terjadi ?
- variable
x
pada methoddoubleIt
diinisiasi dengan nilai salinan dariwages
. - Nilai
x
digandakan,kali 2. - 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;
- Primitive types (
int
,boolean
, dsb) - 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);
}
}
Wow, mengapa salary dari person1 berubah ?
p
diinisiasi dengan nilai salinan darifarras
, yup, yaitu refrensi ke object.- method
multipleSalayar
di aplikasikan ke object reference. Object (instance) dari classPerson
yaitup
(karena mendapatkan object reference) danfarras
akan mendapatkan peningkatansalary
sebanyak duakali lipat. - Method berakhir, parameter
p
tidak lagi digunakan (dihapus), dan tentu, object variablefarras
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;
}
}
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:
- Sebuah method tidak dapat memodifikasi primitive type (integer atau
boolean
) - Method dapat merubah state dari sebuah object parameter.
- Method tidak dapat membuat sebuah object parameter merujuk pada objek yang baru.