Duplicata possible:
Pourquoi utiliser des getters et setters?
Y a-t-il un avantage à rendre les méthodes pour accéder aux variables privées dans votre classe au lieu de rendre la variable publique?
Par exemple, le deuxième cas est-il meilleur que le premier?
//Case 1
public class Shoe{
public int size;
}
//Case 2
public class Shoe{
private int size;
public int getSize(){
return size;
}
public void setSize(int sz){
size = sz;
}
}
Ce que j'ai vu un jour sur SO, comme réponse (écrit par @ ChssPly76) pourquoi utiliser des getters et setters
Parce que dans 2 semaines (mois, années) à partir de maintenant, lorsque vous réaliserez que votre setter doit faire plus que simplement définir la valeur, vous vous rendrez également compte que la propriété a été utilisée directement dans 238 autres classes :-)
il y a bien plus d'avantages:
avant:
private boolean alive = true;
public boolean isAlive() { return alive; }
public void setAlive(boolean alive) { this.alive = alive; }
après:
private int hp; // change!
public boolean isAlive() { return hp > 0; } // old signature
//method looks the same, no change in client code
public void setAlive(boolean alive) { this.hp = alive ? 100 : 0; }
EDIT : un nouveau advange supplémentaire lorsque vous utilisez Eclipse - vous pouvez créer un point de surveillance sur le terrain, mais si vous avez un setter, vous avez juste besoin d'un point d'arrêt, et .. . les points d'arrêt (par exemple dans la méthode de définition) peuvent être conditionnels, les points d'observation (sur le terrain) ne peuvent pas. Donc, si vous souhaitez arrêter votre débogueur uniquement si x=10
vous ne pouvez le faire qu'avec un point d'arrêt à l'intérieur du setter.
L'utilisation de la variable publique peut entraîner la définition de valeurs incorrectes pour la variable comme la valeur d'entrée ne peut pas être vérifiée.
par exemple:
public class A{
public int x; // Value can be directly assigned to x without checking.
}
L'utilisation de setter peut être utilisée pour définir la variable avec vérification de l'entrée. Garder l'instance varibale privée, et getter et setter public est une forme de Encapsulation getter et setter est également compatible avec Java Beans standard,
getter et setter aide également à implémentation du concept de polymorphisme
par exemple:
public class A{
private int x; //
public void setX(int x){
if (x>0){ // Checking of Value
this.x = x;
}
else{
System.out.println("Input invalid");
}
}
public int getX(){
return this.x;
}
Exemple polymorphe: Nous pouvons affecter la variable de référence d'objet du type Sub comme argument de la méthode d'appel à la variable de référence d'objet du paramètre de super classe de la méthode appelée.
public class Animal{
public void setSound(Animal a) {
if (a instanceof Dog) { // Checking animal type
System.out.println("Bark");
}
else if (a instanceof Cat) { // Checking animal type
System.out.println("Meowww");
}
}
}
Une façon un peu en arrière de voir les choses.
Y a-t-il des circonstances où il est préférable d'exposer le fonctionnement interne de votre classe en rendant public une variable membre, afin que tout consommateur puisse faire des choses que le concepteur n'a jamais imaginées, conduisant à un festin d'échec et à une corne d'abondance d'accidents?
Sorte de réponse elle-même vraiment que l'on ne fait pas?
Principe fondamental de l'OO, encapsulation. Une variable membre publique est essentiellement une variable globale avec un préfixe ...