80 votes

Quel est l'intérêt des Getters et des Setters?

Double Possible:
Pourquoi utiliser les accesseurs et mutateurs?

J'ai lu des livres sur Java, en disant qu'il est bon de créer des setters et getters pour des variables telles que x et y. Par exemple:

public int getX(){
    return x;
}

public void setX(int x){
    this.x = x;
}

Mais qu'est-ce que la différence de part et d'

...(shape.x)...   // basically getX()

et

shape.x = 90;    // basically setX()

Si les setters et getters sont mieux, pourriez-vous m'expliquer ce que pratique les problèmes?

87voto

mprabhat Points 11553

De multiples raisons:

  • Si vous autorisez l'accès sur le terrain comme

    forme.x = 90

ensuite, vous ne pouvez pas ajouter n'importe quelle logique dans l'avenir afin de valider les données.

dire si x ne peut pas être inférieure à 100 vous ne pouvez pas le faire, cependant, si vous avez eu des setters comme

public void setShapeValue(int shapeValue){
  if(shapeValue < 100){
    //do something here like throw exception.
  }
}
  • Vous ne pouvez pas ajouter quelque chose comme la copie sur écriture logique (voir CopyOnWriteArrayList)
  • Une autre raison est pour accéder à des champs à l'extérieur de votre classe, vous marquez publics, protégés ou par défaut, et donc vous perdez le contrôle. Lorsque les données sont internes à la classe de briser l'Encapsulation et, en général, OUPS méthodologie.

Bien que pour les constantes comme

public final String SOMETHING = "SOMETHING";

vous aurez accès sur le terrain comme ils ne peuvent pas être modifiés, par exemple la variable que vous allez les placer avec des getters, setters.

  • Un autre scénario, c'est quand vous voulez que votre Classe soit immuable, si vous autorisez l'accès sur le terrain puis de rompre l'immutabilité de votre classe car les valeurs peuvent être modifiées. Mais si vous soigneusement conception de votre classe avec des getters et pas de poseurs de vous garder l'immutabilité intacte.

Bien que, dans de tels cas, vous devez être prudent dans la méthode de lecture pour vous assurer de ne pas donner de référence des objets(dans le cas où votre classe d'objet comme des cas).

Nous pouvons utiliser les variables privées dans un paquet à l'aide de getters et setters.

12voto

JustinDanielson Points 1905

À l'aide de méthodes getter et setter fonctions permettent de contraintes et d'encapsulation. Permet de dire que x est le rayon. forme.x = -10 serait pas beaucoup de sens. Aussi, si quelqu'un tente de définir une valeur illégale, vous pouvez imprimer une erreur, définissez une valeur par défaut, ou ne rien faire.

Il est de bonne pratique de faire des variables de membre privé de sorte qu'ils ne peuvent pas être modifiées directement par les programmes de les utiliser.

Mutateur fonctions
L'Encapsulation

6voto

Michael Kjörling Points 3939

Beaucoup de personnes ont mentionné encapsulant les spécificités de la mise en œuvre, ce qui pour moi est la principale raison d'utiliser les accesseurs et mutateurs dans une classe. Avec cela, vous obtenez également beaucoup d'autres avantages, notamment la possibilité de jeter et remplacer la mise en œuvre sur un coup de tête sans avoir besoin de toucher chaque morceau de code qui utilise votre classe. Dans un petit projet, qui n'est pas un grand avantage, mais si votre code se termine comme un bien utilisé (interne ou public) de la bibliothèque, il peut être un énorme avantage.

Un exemple précis: les nombres complexes en mathématiques. Certains langages comme une langue ou un cadre de fonctionnalité, d'autres ne le font pas. Je vais utiliser une mutable classe comme un exemple ici, mais il pourrait tout aussi facilement être immuable.

Un nombre complexe peut être écrit sur le formulaire a + bi avec des parties réelles et imaginaires, se prête bien à l' [gs]etRealPart et [gs]etImaginaryPart.

Cependant, dans certains cas, il est plus facile de raisonner sur les nombres complexes sur la forme polaire re^(iθ), donner des [gs]etRadius (r) et [gs]etAngle (θ).

Vous pouvez également exposer des méthodes comme l' [gs]etComplexNumber(realPart, imaginaryPart) et [gs]etComplexNumber(radius, angle). Selon les types d'argument celles-ci peuvent ou peuvent ne pas avoir besoin des noms différents, mais la classe " consommateur peut utiliser soit comme s'adapte à ses besoins.

Les deux formes sont interchangeables, vous pouvez assez facilement convertir de l'un à l'autre, ce qui forme la classe utilise pour le stockage interne n'est pas pertinent pour les consommateurs de cette classe. Toutefois, les consommateurs peuvent utiliser l'une ou l'autre forme. Si vous choisissez la forme a+bi pour la représentation interne, et de l' exposer à l'aide de champs plutôt que de les getters et les setters, non seulement avez-vous de la force de la classe des consommateurs de l'utiliser, vous ne pouvez plus facilement changer d'avis et de remplacer la représentation interne avec re^(iθ) parce que s'avère être la plus facile à mettre en œuvre dans votre scénario. Vous êtes coincé avec le public de l'API que vous avez défini, qui prévoit spécifiquement les parties réelles et imaginaires sont exposés à l'aide des noms de champs spécifiques.

4voto

Bhavik Ambani Points 3776

Une autre bonne raison d'utilisateur getter et setter peut être comprendre par l'exemple suivant

public class TestGetterSetter{
    private String name ;


    public void setName(String name){
        this.name = name ;
    }


    public String getName(String name){
        return this.name ;
    }
}

Le point de getters et setters, c'est que qu'ils sont destinés à être utilisés pour l'accès privé varialble, qui ils sont ou les réglages. De cette façon, vous fournir de l'encapsulation et il sera beaucoup plus facile de revoir ou de modifier votre code plus tard.

Imaginez que vous utilisez le nom au lieu de son acquéreur. Alors si vous voulez ajouter quelque chose comme un défaut (dire le nom par défaut est "Invité" si ce n'était pas définie avant), alors vous aurez à modifier à la fois la lecture et de l'sayName fonction.

public class TestGetterSetter{
    private String name ;


    public void setName(String name){
        this.name = name ;
    }


    public String getName(String name){
        if (this.name == null ){
            setName("Guest");
        }
        return this.name ;
    }
}

Il n'est pas nécessaire pour les méthodes de lecture et de définition de commencer avec get et set - ils sont juste des fonctions membres. Cependant, c'est une convention à le faire. (surtout si vous utilisez Java Beans)

4voto

nsfyn55 Points 4753

Une des meilleures raisons que je peux penser pour les getters et les setters est la permanence d'une classe de l'API. Dans des langages comme python, vous pouvez accéder à des membres par leur nom et de les passer à des méthodes plus tard. Parce que les fonctions se comportent différemment des membres en java une fois que vous accéder à une propriété thats it. La restriction de son champ d'application plus tard rompt le client.

En fournissant des getters et setters un programmeur a la possibilité de modifier les membres et le comportement librement aussi longtemps que l'respecter le contrat décrit par l'API publique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X