2009-07-07 4 views
19

Je lis mon livre Deitel, Java Comment programmer et suis tombé sur le terme l'observation. Si l'observation est autorisée, quelle est la situation ou quel est son but dans une classe Java?À quoi sert l'observation variable dans une classe Java?

Exemple:

public class Foo { 

    int x = 5; 

    public void useField() { 
     System.out.println(this.x); 
    } 
    public void useLocal() { 
     int x = 10; 
     System.out.println(x); 
    } 
} 

Répondre

32

Le but fondamental de l'observation est de découpler le code local de la classe environnante. Si ce n'était pas disponible, alors considérez le cas suivant.

Une classe Foo dans une API est libérée. Dans votre code, vous le sous-classez, et dans votre sous-classe, utilisez une variable appelée barre. Ensuite, Foo publie une mise à jour et ajoute une variable protégée appelée Bar à sa classe.

Maintenant, votre classe ne fonctionnera pas en raison d'un conflit que vous ne pouviez pas anticiper.

Cependant, ne le faites pas exprès. Ne laissez cela se produire que lorsque vous vous souciez vraiment de ce qui se passe en dehors de la portée.

+7

J'aime votre dernier point "Ne laissez cela se produire que lorsque vous vous souciez vraiment de ce qui se passe en dehors de la portée." ... vous savez quand commencer à prendre soin quand quelque chose de bizarre commence à se passer avec votre valeur de variable d'instance :))) Quoi qu'il en soit, c'est une bonne habitude de toujours utiliser this.variable_name dans vos méthodes qui définissent la valeur d'une instance variable... – luigi7up

8

Un but principal est de confondre les gens. C'est une mauvaise pratique et devrait être évitée.

+0

Controverse Je suppose ;-) –

+6

Pouvez-vous expliquer davantage comment this.x = x est tout confus? – RichieHH

13

Il peut être utile pour setters où vous ne voulez pas avoir à créer un nom de variable séparée juste pour le paramètre de méthode, par exemple:

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

En dehors de cela je les éviter.

+1

C'est une raison terrible pour les variables d'ombre. L'observation vous ouvre toujours aux erreurs potentielles, et il est plus facile de nommer les variables avec des informations d'étendue, ainsi que de changer le nom du paramètre, que d'inclure "ceci". à chaque fois. – Rick

+3

Pour un setter simple, comme dans l'exemple ci-dessus, je pense que c'est bien, renommer le paramètre rendrait les choses moche. Rien de plus compliqué que cela, je suis d'accord, évitez complètement. –

4

L'ombrage n'est pas vraiment un terme Java uniquement. Dans tous les cas où une variable déclarée dans une étendue porte le même nom qu'une dans une portée plus grande, cette variable est ombrée.

Certaines utilisations courantes de l'observation sont lorsque vous avez des classes interne et externe et que vous souhaitez conserver une variable portant le même nom.

Si vous pouvez l'éviter cependant, vous devriez le faire car cela pourrait causer de la confusion.

1

Les deux utilisations courantes sont des constructeurs et des méthodes définies:

public Foo(int x) { 
    this.x = x; 
} 

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

Très occassionally il est utile si vous voulez une copie de la variable à un instant unique, mais la variable peut changer dans l'appel de méthode.

private void fire() { 
    Listener[] listeners = this.listeners; 
    int num = listeners.length; 
    for (int ct=0; ct<num; ++ct) { 
     listeners[ct].stateChanged(); 
    } 
} 

(Bien sûr, un exemple artificiel fait inutile avec le chic boucle.)

+0

Il n'est pas nécessaire d'effectuer une ombre pour l'un ou l'autre de ces cas. – Rick

+1

@Rick Personne ne parlait de cela étant nécessaire. L'observation n'est pas nécessaire. –

+0

Je dis, on ne devrait jamais l'ombre. Nommez simplement les variables différemment. – Rick

Questions connexes