Méthodes accesseur en Java
J'ai donc une question sur "setter" et les méthodes "getter" et l'utilité dont ils sont ou ne sont pas.
Disons que je viens d'écrire une programme de base comme suit:
public class Account
{
String name;
String address;
double balance;
}
Alors, disons que j'écris une autre classe qui utilise ce "Compte" de la classe, comme suit:
class UseAccount
{
public static void main(String[] args)
{
Account myAccount = new Account();
Account yourAccount = new Account();
myAccount.name = "Blah blah"
}
}
etc., etc.
Quand j'écris myAccount.name = "Blah blah"
, je suis l'évolution de la valeur de la variable "nom" dans le "Compte" de la classe. Je suis libre de le faire autant de fois que j'aime avec le code écrit de la façon dont il est. Il est venu à mon attention, cependant, qu'il est préférable de faire les variables dans le "Compte" class privé, et ensuite utiliser un "setter" et les méthodes "getter". Donc, si j'ai écrit ce qui suit:
public class Account
{
private String name;
private String address;
private String balance;
public void setName(String n)
{
name = n;
}
public String getName()
{
return name;
}
}
Je peux toujours modifier la valeur de la variable "nom" par la simple création d'une autre classe qui a quelque chose comme:
class UseAccount
{
public static void main(String[] args)
{
Account myAccount = new Account();
myAccount.setName("Blah blah");
}
}
Je ne comprends pas comment à l'aide de cette méthode est toute différente, ou est censé empêcher les gens formulaire de modification de la valeur d'un champ privé. Toute aide?
OriginalL'auteur Ryan Christman | 2012-07-16
Vous devez vous connecter pour publier un commentaire.
Essayer cette Règle d'Or de la Programmation Orientée Objet.
1. Créer privé variables d'Instance.
2. Créer public getters et setters pour accéder à ces variable d'Instance.
3. Cette méthode est appelée Encapsulation. Si Encapsulation peut être utilisé dans un différents
façon, qui a de l'importance dans Modèles de Conception, à l'Instar de Ces Comportements, qui ne cesse de changer doit
être encapsulé dans une Classe Abstraite ou une interface.
4. Eh bien maintenant, revenons au sujet de Getter et Setter....
Getter et Setter aide à la Validation de l'Entrée à la Variable d'Instance.
Pour exemple:
Supposons que j'ai une méthode pour attribuer l'Âge du Chien, Maintenant, l'âge ne peut Pas être négatif, Si je n'ai pas de méthode de définition, alors je ne vais pas être en mesure de Valider l'Entrée de l'âge.
private int health = 500
. Alors, si quelqu'un a essayé de tricher en définissant leur santé à 1000 ou quelque chose, la méthode setter pourrait avoir quelque chose comme:if health > 500
puis bla bla bla ne leur permet pas de le faire.Pour être complet, vous pouvez les modifier a la protection des exemples de Bohème
Je suppose que la santé peut être de 1 à 500 droit.... donc, si c'est le cas, utiliser la méthode de définition pour définir..
dont set it directly as private int health = 500;
simplement déclarer queprivate int health;
. Oui vous pouvez le vérifier dans la méthode de définition de la santé>500L'Encapsulation est définitivement pas à propos des méthodes accesseurs. Contrairement à cette réponse, les méthodes d'accès à briser l'encapsulation plus souvent que les autres.
Je tiens à souligner que toutes les contraintes, comme l'âge de la contrainte ci-dessus, doivent être documentées. Aussi, je suggère l'utilisation de plus de sens des messages de commentaires. Vous devriez toujours clairement document et de l'état de votre méthode de contrats.
OriginalL'auteur Kumar Vivek Mitra
Avec trivial méthodes d'accès, il n'y a pas de différence mis à part le style, mais vous pouvez également exécuter du code avec eux, par exemple:
Vous pouvez également retourner copies à partir d'un getter, protégeant ainsi vos données:
Ce sont juste deux exemples simples, mais il y a sans limites des exemples de la façon dont accesseur méthodes peuvent être utilisées.
Il est préférable de suivre un style cohérent, c'est pourquoi nous utilisons toujours les getters/setters - si le code de cette manière peut être exécutée en cas de besoin.
+1 pour la prévention des mauvais paramètre de transmission
OriginalL'auteur Bohemian
L'avantage de l'utilisation de poseurs de sna getters est que vous pouvez inclure des règles de l'initialisation tardive, validation, etc. Aussi, si vous avez besoin de mettre en œuvre des Java Beans code de plainte, vous devez suivre ces règles.
Java Beans spec
OriginalL'auteur Marcelo
Si votre code ne change jamais, alors vous avez raison - il n'y a pas de différence.
Cependant, le code change beaucoup de choses. Qu'advient-il si vous avez besoin de garder une trace de qui a modifié leur nom?
Vous auriez besoin d'avoir une valeur booléenne dans le Compte de classe qui allait changer pour vrai à chaque fois que le nom de domaine a changé.
Alors maintenant, vous devez aller à travers chaque fichier source et de mettre un
myAccount.nameChanged = true'
sous chaquemyAccount.name = whatever;
Si vous commencez à avoir la duplication de code et la possibilité pour les bugs augmente. Qu'advient-il si j'ai raté un changement de nom?
La meilleure façon de contrer cela est de disposer de variables membres classés comme
private
.Votre setName code devrait ressembler à quelque chose comme ceci:
Et vous n'avez pas à vous soucier de bugs!
OriginalL'auteur Brad
Ce qui est appelé
Encapsulation
lorsque vous êtes déclarant certaines variables d'instance et de la déclaration depublic getter
etsetter method
d'accéder et de modifier les variables d'instance de la valeur.Si vous utilisez ces méthodes getter et setter pour accéder à/définir les variables d'instance puis il bénéficiaires que votre programme ne serait pas échouer si un développeur modifie la variable d'instance noms.
Par exemple dans la version actuelle que vous utilisez le nom, l'adresse, l'équilibre, les variables d'Instance et y ont accès sans getter et setter comme
myAccount.setName("Blah blah");
mais si, à la prochaine version développeur de changements de variable d'instance nom dename
àuserName
dans ce cas, l'utilisateur programme va casser, mais si vous utilisez les méthodes getter et setter il ne serait pas de casser le développeur ne serait pas de changement de getter et setter nom de la méthode(selon OOPS fondamentaux).OriginalL'auteur Pramod Kumar
Vous pouvez toujours développer une application sans l'aide de méthodes getter et setter.Comme vous l'avez expliqué.Mais en utilisant les méthodes getter et setter est une meilleure pratique en raison des modificateurs d'accès privé/public vous donne l'encapsulation qui est OUPS fonctionnalité.
Vous pouvez toujours écrire votre programme sans utiliser OUPS fonctionnalités comme l'encapsulation,abstraction,héritage...mais si vous écrivez des applications importantes, sans l'aide de vous aurez de la difficulté à maintenir et allait bientôt se rendre compte de l'importance de ces caractéristiques.
OriginalL'auteur HakunaMatata
Comme une question de fait, il n'est pas d'empêcher et il n'y a pas de différence, jusqu'à la modification des modificateurs d'accès pour les getter/setter ou en ajouter d'autres logiques. Ces derniers n'étant pas toujours une bonne idée, mais parfois utile, par exemple, mise à jour le nom devrait forcer la mise à jour de certaines valeur mise en cache ou l'exécution de certains contrôles. À l'aide des getters/setters sont une bonne pratique et utilisé dans plusieurs approches, comme Pojo et JavaBeans, mais si vous n'allez pas ajouter une logique personnalisée dans des getters/setters et ne vont pas à l'utilisation de ces approches que vous serez satisfait de l'utilisation d'un accès direct aux champs.
Une chose que je voudrais mentionner. À l'aide des getters/setters vous pouvez fournir calculées lors de l'exécution des champs qui n'existe pas persistante dans l'objet. Par exemple, votre
Account
de la classe de l'objet du titulaire date de naissance et vous avez besoin pour obtenir de l'âge de celui-ci.OriginalL'auteur Viktor Stolbin
La java mot clé "private" en face de chaque Compte
de la classe de terrain dans les déclarations, les empêche de se référer directement à ce domaine.
Si vous mettez votre compte client.name = “quelque chose” dans l'
UseAccount classe, vous obtenez le message d'erreur: "le nom a un accès privé dans le Compte".
Au lieu de faire référence à myAccount.le nom, le UseAccount programmeur besoin de
appel de la méthode myAccount.setName ou de la méthode myAccount.getName. Ces
les méthodes sont appelées méthodes d'accès, car ils fournissent l'accès au Compte de la classe des champs.
OriginalL'auteur StrifeSephiroth