Pourquoi la méthode getter et setter est-elle importante en java? [dupliquer]

cette question a déjà une réponse ici:

  • Pourquoi utiliser getters et setters / accessors? [fermé] 38 réponses

on m'a appris à toujours utiliser getters et setters. Cependant, je ne connais pas les avantages et les inconvénients de ces méthodes, que par leur mise en œuvre nous exposons les données et aussi de le cacher.

je suis un peu confus à ce sujet. Quelqu'un peut-il donner quelques conseils sur la raison pour laquelle nous utilisons un getter/setter et quels sont les avantages?

30
demandé sur Nike15 2012-01-12 09:59:13

6 réponses

La base "privé domaine public getter et setter qui ne font rien, mais de retour ou de définir le champ" motif est en effet complètement inutile quand il s'agit de l'encapsulation, sauf qu'il vous donne une chance de changer plus tard sans modification de l'API.

alors n'utilisez pas ce motif sans réfléchir. Examinez attentivement les opérations dont vous avez réellement besoin.

le vrai point de getters et setters est que vous ne devez les utiliser que là où ils sont appropriées, et qu'ils peuvent faire plus que simplement obtenir et définir les champs.

  • vous ne pouvez avoir qu'un getter. Ensuite, la propriété est en lecture seule. Ce devrait être le cas le plus courant.
  • Vous ne pouvez avoir qu'un setter, faisant de la propriété configurable, mais le fait de communiquer que rien d'autre ne devrait dépendre de sa valeur
  • un getter peut calculer une valeur à partir de plusieurs champs plutôt que de retourner un champ.
  • A getter peut faire une copie défensive
  • un getter peut effectuer une opération de fetch coûteuse et utiliser un champ pour mettre en cache la valeur
  • un setter peut faire des contrôles de santé mentale et jeter IllegalArgumentException
  • un régleur peut informer les auditeurs des changements de la valeur
  • vous pouvez avoir un setter qui met plusieurs champs ensemble parce qu'ils vont ensemble conceptuellement. Cela n'est pas conforme à la spécification JavaBeans, donc ne pas le faire si vous comptez sur des cadres ou des outils qui attendent des JavaBeans. Sinon, c'est une option utile.

toutes ces choses sont des détails d'implémentation qui sont cachés derrière la simple interface "getter and setter". C'est ce que l'encapsulation est d'environ.

56
répondu Michael Borgwardt 2014-05-06 19:16:54

l'idée de getters et setters est de contrôler l'accès aux variables d'une classe. De cette façon, si la valeur doit être changée en interne pour être représentée d'une manière différente, vous pouvez le faire sans casser aucun code en dehors de la classe.

par exemple, disons que vous aviez une classe avec une variable de distance, et elle a été mesurée en pouces. Quelques mois passent, vous utilisez cette classe dans beaucoup d'endroits et vous réalisez soudainement que vous aviez besoin de représenter cette valeur en centimètre. Si vous n'utilisez pas un getter et un setter, vous devrez traquer chaque utilisation de la classe et de les convertir. Si vous avez utilisé un getter et un setter, vous pouvez simplement changer ces méthodes et tout ce qui utilise la classe ne sera pas cassé.

public class Measurement
{

    /**
     * The distance in centimeters.
     */
    private double distance;

    /**
     * Gets the distance in inches.
     * @return A distance value.
     */
    public double getDistance()
    {
        return distance / 2.54;
    }

    /**
     * Sets the distance.
     * @param distance The distance, in inches.
     */
    public void setDistance(double distance)
    {
        this.distance = distance * 2.54;
    }
}
14
répondu Robert Rouhani 2012-01-12 06:05:16

un bon avantage vient à l'esprit est que vous pouvez faire un champ en lecture seule en ne mettant pas en œuvre un setter pour ce champ particulier.

6
répondu Sandeep Pathak 2012-01-12 06:02:47

il n'y a rien de mal à utiliser avec getters et setters - il suffit de savoir que par en les utilisant et en les rendant publiques, vous exposez vos variables et, d'une certaine manière, violez l'encapsulation. C'est ce que l'article que vous mentionnez essaie de prévenir - ne générez pas automatiquement getters et setters pour toutes les variables d'instances privées; pensez à ce que vous voulez exposer à d'autres classes (et à quel niveau, i.e. privé / protégé / public) de sorte que vous exposez seulement comme nécessaire.

2
répondu Amos M. Carpenter 2012-01-12 06:10:24

Voici l'inconvénient. Getters / Setters ont tendance à exposer les détails de mise en œuvre de votre classe au monde extérieur. Ce n'est pas une bonne chose. Imaginez que vous écrivez un mécanicien Automobile logiciel. Ainsi, vous aurez besoin d'une classe de voiture, et donc vous exposez getters et setters pour les champs

Date lastOilChangeDate;
int lastOilChangeMileage;

dans la présente classe. C'est parce que le logiciel veut envoyer des e-mails lorsque les voitures du client ont besoin de changements d'huile.

mais ce qui se passe quand Nouveau les voitures sortent où vous déterminez si une voiture a besoin d'un changement d'huile différemment de "tous les 3000 miles ou 3 mois"? Peut-être que ces nouvelles voitures ont un capteur dans le carter d'huile qui a mesuré la saleté. Évidemment, vous voulez les utiliser pour déterminer si un changement d'huile est nécessaire.

le problème était que vous résolviez le mauvais problème avec ces getter/setters. Personne ne veut vraiment savoir quand le dernier changement d'huile a été, ils veulent savoir si vous avez besoin d'un autre. Ils étaient juste détails de mise en œuvre, mais vous les avez intégrés à l'interface. Ce que vous auriez dû faire a été ajouté une méthode

public boolean needsOilChange() 

et ensuite la classe de voiture pouvait mettre en œuvre comme elle voulait. Si l'algorithme change, la classe mécanique n'aura pas à le faire car tout ce dont elle a besoin est la méthode needsOilChange.

2
répondu MeBigFatGuy 2012-01-12 06:29:21

il est principalement utilisé dans les grains de Java comme ci-dessous.

public Class MyBean{

private int var1;

public void setVar1(int pVar1){

this.var1=pvar1;

}

public int getVar1(){

retour var1;`

}

}

les prestations sont les suivantes:"

1. avec ceci nous pouvons atteindre Encapsulation

2. il est appelé comme DTO (Data Transfer Object) modèle de conception. il est utilisé pour transférer des données d'une couche à une autre dans les applications MVC. comme u peut obtenir des données saisies par l'utilisateur à partir du formulaire (en utilisant getters) et u peut utiliser les mêmes données à insérer dans la base de données(en utilisant setter) et vice verca. dernier cadres (Printemps )fournissant comme fonctionnalité intégrée.

-2
répondu Balaswamy Vaddeman 2012-01-12 06:15:52