Accessor dan modifier (alias setter dan getter) berguna untuk tiga alasan utama:
- Mereka membatasi akses ke variabel.
- Misalnya, variabel dapat diakses, tetapi tidak dimodifikasi.
- Mereka memvalidasi parameter.
- Mereka dapat menyebabkan beberapa efek samping.
Universitas, kursus online, tutorial, artikel blog, dan contoh kode di web semuanya menekankan tentang pentingnya pengakses dan pengubah, mereka hampir merasa seperti "harus memiliki" untuk kode saat ini. Jadi orang dapat menemukannya bahkan ketika mereka tidak memberikan nilai tambahan, seperti kode di bawah ini.
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
Yang telah dikatakan, sangat umum untuk menemukan pengubah yang lebih berguna, yang sebenarnya memvalidasi parameter dan melemparkan pengecualian atau mengembalikan boolean jika input yang tidak valid telah disediakan, sesuatu seperti ini:
/**
* Sets the age for the current cat
* @param age an integer with the valid values between 0 and 25
* @return true if value has been assigned and false if the parameter is invalid
*/
public boolean setAge(int age) {
//Validate your parameters, valid age for a cat is between 0 and 25 years
if(age > 0 && age < 25) {
this.age = age;
return true;
}
return false;
}
Tetapi bahkan kemudian, saya hampir tidak pernah melihat pemodifikasi dipanggil dari sebuah konstruktor, jadi contoh paling umum dari kelas sederhana yang saya hadapi adalah:
public class Cat {
private int age;
public Cat(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
/**
* Sets the age for the current cat
* @param age an integer with the valid values between 0 and 25
* @return true if value has been assigned and false if the parameter is invalid
*/
public boolean setAge(int age) {
//Validate your parameters, valid age for a cat is between 0 and 25 years
if(age > 0 && age < 25) {
this.age = age;
return true;
}
return false;
}
}
Tetapi orang akan berpikir bahwa pendekatan kedua ini jauh lebih aman:
public class Cat {
private int age;
public Cat(int age) {
//Use the modifier instead of assigning the value directly.
setAge(age);
}
public int getAge() {
return this.age;
}
/**
* Sets the age for the current cat
* @param age an integer with the valid values between 0 and 25
* @return true if value has been assigned and false if the parameter is invalid
*/
public boolean setAge(int age) {
//Validate your parameters, valid age for a cat is between 0 and 25 years
if(age > 0 && age < 25) {
this.age = age;
return true;
}
return false;
}
}
Apakah Anda melihat pola yang sama dalam pengalaman Anda atau hanya karena saya tidak beruntung? Dan jika Anda melakukannya, lalu apa yang menurut Anda menyebabkan itu? Apakah ada kerugian yang jelas untuk menggunakan pengubah dari konstruktor atau mereka hanya dianggap lebih aman? Apakah ini sesuatu yang lain?