2010-06-14 16 views
1

Doublons possibles:
Public Data members vs Getters, Setters
Purpose of private members in a classBut des getters et setters?

Quelle est l'utilisation des accesseurs quand vous pouvez faire vos variables publiques et éviter les tracas de ces lignes comme A.setVariableX(A.getVariableY())?

+0

Copie possible: http://stackoverflow.com/questions/2903385/property-and-encapsulation – Paolo

+0

Juste pour que vous sachiez, j'ai implémenté des getters et setters dans mon programme tout d'abord aussi simple (et imo à l'époque, inutile) fonctionne pour changer ou récupérer des variables, mais elles ont été sauvées pendant le débogage lors du lancement des exceptions. Je ne vois pas comment le débogage serait si facile si elles étaient publiques :) – wrongusername

Répondre

11

Pour masquer les détails d'implémentation. Si vous choisissez de rendre publiques vos propriétés, puis décidez plus tard de changer leur façon de travailler, vous devez modifier tout le code associé. Avec les getters et les setters, vous pouvez souvent modifier les détails de l'implémentation interne sans modifier l'API visible (et donc éviter de devoir modifier le code qui utilise l'API de la classe en question).

0

Cela fait partie du principe d'encapsulation. Vous utilisez des setters et des getters comme interface pour interagir avec votre objet afin de pouvoir, par exemple, ajouter ultérieurement des fonctionnalités (comme la validation des données d'entrée) sans toucher au code qui utilise la ou les classes.

3

Les getters et les setters peuvent effectuer une validation, et une instanciation paresseuse, contrairement aux membres publics. En outre, ce langage n'est pas indépendant de la langue, car la plupart des langages qui implémentent les propriétés éliminent l'implémentation de sorte qu'ils ressemblent à des membres publics dans le code.

+0

Chose étrange, 99% des setters/getters ne sont pas destinés à la validation ou à l'initialisation paresseuse ... Malgré cela, Java est tout à leur sujet. .. regardez les haricots Pojo ... Il est vrai qu'avec l'aide de l'IDE ils ne dérangent pas du tout le développeur, mais quand même ... Cela n'a pas d'importance pour Reflection ... Seule la chose qui s'y rapporte est Proxying, qui nécessite des setters/getters – lisak

3

Parce que parfois il y a des contraintes quant à ce que votre variable pourrait être et d'avoir à vérifier que lorsque vous le définissez, c'est logique. Par exemple, si votre âge n'est pas autorisé à être -1, vous le vérifieriez dans votre setter.

if(value >= 0) 
{ 
    _age = value; 
} 
else 
{ 
    throw new InvalidAgeException("Age may not be less than 0"); 
} 
2

Les setters et getters s'appliquent aux propriétés, quelles que soient les "propriétés" de votre code. Par exemple, vous pouvez avoir une variable angle, qui stocke une valeur d'angle exprimée en radians. Par exemple, vous pouvez utiliser une variable angle. vous pouvez alors définir des setters et des getters pour cette variable, avec n'importe quelle unité d'angle que vous pensez pertinente.