2010-07-27 8 views
3

Possible en double:
Property and EncapsulationJava question publique Var

NEWB Alert !!

Je commence avec Android et Java et je commence à le comprendre mais je me demande pourquoi je devrais utiliser des getters et setters et pas seulement des variables publiques?

Je vois beaucoup de gens créer une variable privée et créer une méthode get and set.

Quelle est l'idée ici?

+1

Pas une question Android. Retagé. – hpique

+1

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

Répondre

8

Son appelé encapsulation et le concept est au cœur de la programmation orientée objet. L'idée est que vous cachez la mise en œuvre de votre classe et qu'exposer le contrat à savoir cacher la comment et seulement exposer les ce.Vous masquez les variables en les rendant privées et fournissez des setters publics - getters et autres méthodes publiques que les clients invoquent pour communiquer avec votre classe. Ils ne sont pas liés à l'implémentation réelle des méthodes ou à la façon dont vous stockez vos variables.

Par exemple, supposons que vous aviez cette classe où vous avez enregistré un numéro de téléphone comme un objet long:

public class ContactInfo { 
    private Long phoneNo; 
    public Long getPhoneNo() { 
     return phoneNo; 
    } 
    public void setPhoneNo(Long phoneNo) { 
     this.phoneNo = phoneNo; 
    } 
} 

Étant donné que les clients de la classe ne voient que le getter/setter, vous pouvez facilement modifier la mise en œuvre la classe/méthodes en basculant la représentation du numéro de téléphone vers un objet PhoneNumber. Les clients de ContactInfo ne seraient pas affectées du tout se:

public class ContactInfo { 
    private PhoneNumber phoneNo; 
    public Long getPhoneNo() { 
     return phoneNo.getNumber(); 
    } 
    public void setPhoneNo(Long phoneNo) { 
     this.phoneNo = new PhoneNumber(phoneNo); 
    } 
} 
public class PhoneNumber { 
    private Long number; 
    public PhoneNumber(Long number) { 
     this.number = number; 
    } 
    public Long getNumber() { 
     return number; 
    } 
} 
+2

+1. Notez que ceci ne signifie pas que vous devriez toujours fournir un getter et un setter pour chaque champ; Dans certains cas, votre conception peut appeler des champs sans aucun accès public. – Feanor

+1

@Feanor. D'accord! C'est un cas pour les variables privées. Le PO voulait cependant savoir pourquoi s'adresser aux getters/setters publics plutôt qu'aux variables publiques, de sorte que la réponse suppose que l'accès public est souhaité. – samitgaur

+0

Très certainement, je pense que votre réponse est claire. Quand j'ai commencé à apprendre Java, je ne comprenais pas que l'on pouvait ne pas vouloir exposer chaque champ via get/set. Je me suis dit que depuis que l'OP a mentionné la nouveauté, il vaudrait la peine d'ajouter ce petit morceau. – Feanor

0

Je crois que l'idée est « cacher l'information » http://en.wikipedia.org/wiki/Information_hiding

Il sert également à contrôler l'accès aux variables (fournit une interface). Par exemple, vous pouvez fournir un getter mais pas un setter, afin qu'ils puissent être lus mais pas écrits. Alors que si tout était public n'importe quelle chose pouvait lire et écrire aux variables.

Il est également important de vérifier/valider la nécessité de définir une variable. Par exemple, vous avez un String name qui n'est pas autorisé à être vide mais s'il est public, il peut facilement être oublié et défini comme name = "". Si vous avez un setter tel que public boolean setName(String newName) vous pouvez vérifier la longueur newName et retourner vrai ou faux s'il passe et est réglé ou non

1

Le concept OOP impliqué est l'encapsulation (google it). Certains des avantages sont: vous pouvez spécifier un niveau d'accès différent pour les setters (mutators) et getters (accesseurs), par exemple getter public et setter privé. Un autre avantage est que vous pouvez ajouter un autre code autre que la modification ou la récupération de la valeur. Par exemple, vous souhaiterez peut-être vérifier la validité de la valeur définie, ou vous souhaitez lancer des exceptions ou déclencher des événements en réponse à la modification de la variable à une certaine valeur. Si vous les implémentez à l'intérieur d'un accesseur ou de mutators, vous pouvez également modifier leurs implémentations sans changer de code en dehors de la classe.

0

Le concept est appelé encapsulation.

Ce qu'il tente de faire est de séparer la structure interne d'une classe de son comportement.

Par exemple, supposons une classe comme cette

public class Point{ 

    private float x; 
    private float y; 

    public float getX(){ 

    return x; 
    } 

    public float getY(){ 
    return y; 
    } 

    public float distanceToZero2(){ 

    return x*x + y*y 
    } 

    public float getAngle(){ 
    //havent considered the x = 0 case. 
    return atan(y/x); 

    } 

public boolean isInFirstQuad(){ 

    return x>0 && y>0; 
} 
} 

Dans ce cas, l'encapsulation se cache la structure interne de la classe, et expose que les opérations disponibles à un point. Si vous ne l'aimez pas, vous pouvez changer sa structure interne et maintenir son comportement (par exemple, en changeant les coordonnées cartésiennes en coordonnées polaires).

Anyoune qui utilise cette classe ne s'en souciera pas, il/elle sera heureux d'avoir une classe Point avec cette fonctionnalité.

0

apartés l'encapsulation, vous pouvez également contrôler la valeur obtenir ou définir votre variable dans certains cas. Par exemple, vous voulez valider la valeur d'une variable age qui devrait être> = 1

class Person { 
    private int age = Integer.MIN_VALUE; 

public void setAge(int age){ 
    if(age>=1) 
     this.age = age; 
} 


public int getAge(){ 
    return age; 
} 
}