Erişimciler ve değiştiriciler (aka ayarlayıcılar ve alıcılar) üç ana nedenden dolayı faydalıdır:
- Değişkenlere erişimi kısıtlarlar.
- Örneğin, bir değişkene erişilebilir, ancak değiştirilemez.
- Parametreleri doğrularlar.
- Bazı yan etkilere neden olabilirler.
İnternetteki üniversiteler, çevrimiçi kurslar, dersler, blog yazıları ve kod örnekleri, erişim sağlayıcıların ve değiştiricilerin önemi konusunda strese giriyor; Böylece kişi, aşağıdaki kod gibi herhangi bir ek değer sağlamadığında bile onları bulabilir.
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
Buna göre, parametreleri gerçekten doğrulayan ve bir istisna atan veya geçersiz girdi sağlanmışsa, bir boole döndüren, daha yararlı değiştiriciler bulmak çok yaygındır:
/**
* 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;
}
Fakat o zaman bile, neredeyse hiçbir zaman değiştiricilerin bir kurucudan çağrıldığını görmüyorum, bu yüzden karşılaştığım basit bir sınıfın en yaygın örneği şudur:
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;
}
}
Ancak bu ikinci yaklaşımın çok daha güvenli olduğu düşünülüyor:
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;
}
}
Deneyiminizde benzer bir kalıp görüyor musunuz, yoksa sadece şanssız mıyım? Ve eğer yaparsan, o zaman sence buna neden olan nedir? Yapıcılardan değiştiricileri kullanmak için bariz bir dezavantaj var mı, yoksa daha güvenli oldukları mı düşünüldü? Başka bir şey mi var?