web-dev-qa-db-fra.com

Java - quand utiliser le mot-clé 'this'

Quelle est la meilleure pratique pour utiliser le mot clé this en Java? Par exemple, j'ai la classe suivante:

class Foo {
    Bar bar;

    public Foo(Bar bar) {
         this.bar = bar;
    }
}

C'est bien et tout, mais Java est assez intelligent pour savoir ce qui se passe si je change l'instruction dans le constructeur en

 bar = bar;

Alors pourquoi utiliser le mot clé this? (Je me rends compte dans certaines situations, il est totalement nécessaire de l'utiliser, je demande juste des situations comme celle-ci). En fait, j'ai tendance à utiliser le mot clé uniquement pour des raisons de lisibilité, mais quelle est la pratique courante? En l'utilisant partout dans la boutique, mon code semble un peu désordonné, par exemple

boolean baz;
int someIndex = 5;
this.baz = this.bar.getSomeNumber() == this.someBarArray[this.someIndex].getSomeNumber();

Évidemment un peu de code mais cela illustre mon exemple. Est-ce simplement dû à des préférences personnelles dans ces cas?

68
jackbot

mais Java est assez intelligent pour savoir ce qui se passe si je change l'instruction dans le constructeur en

  bar = bar;

FAUX! Il compile mais ne fait pas ce que vous pensez qu'il fait!

Quant à savoir quand l'utiliser, une grande partie est une préférence personnelle. J'aime utiliser this dans mes méthodes publiques, même quand ce n'est pas nécessaire, car c'est là que l'interfaçage se produit et c'est bien d'affirmer ce qui est à moi et ce qui ne l'est pas.

Comme référence, vous pouvez consulter les tutoriels Oracle Java sur this.subject ;-)

http://docs.Oracle.com/javase/tutorial/Java/javaOO/thiskey.html

75
polygenelubricants

Vous devez l'utiliser lorsque vous avez un paramètre avec le même nom qu'un champ, sinon vous rencontrerez des problèmes. Il compilera, mais ne fera pas nécessairement ce que vous voulez.

Comme partout ailleurs, ne l'utilisez pas sauf si cela est nécessaire pour des raisons de lisibilité. Si vous l'utilisez partout, 20% de votre code sera composé du mot "ceci"!

13
Dónal Boyle

Réellement

baz = baz

lèvera cet avertissement

L'affectation à la variable baz n'a aucun effet

Donc, ce que vous pensez être faux, la portée locale remplace l'attribut de classe afin que vous DEVEZ utilisez this mot-clé explicitement pour affecter la variable à la classe attribut.

Sinon, la variable prise en compte dans l'affectation n'est que celle transmise en tant que paramètre et celle de classe est ignorée. C'est pourquoi this est utile, ce n'est pas un fait de lisibilité, c'est un fait de décider explicitement de quel baz vous parlez.

Je dirais

utilisez this partout où ne pas l'utiliser entraînerait des ambiguïtés (ou un avertissement du compilateur, qui sont plus importants), sinon laissez-le simplement. Puisque son but est exactement de résoudre les ambiguïtés lorsque les hypothèses par défaut (d'abord vérifier les sections locales, puis vérifier les attributs de classe) ne suffisent pas.

11
Jack

this mot-clé fait référence à l'objet de classe sur lequel une méthode est invoquée.
Par exemple:

public class Xyz {  
    public Xyz(Abc ob)
    {
        ob.show();
    }
}

public class Abc {
    int a = 10;

    public Abc()
    {
        new Xyz(this);
    }

    public void show()
    {
        System.out.println("Value of a " + a);
    }

    public static void main(String s[])
    {
        new Abc();
    }
}

Ici, dans Abc() nous appelons Xyz() qui a besoin d'un objet de classe Abc .. Nous pouvons donc passer this au lieu de nouveau Abc(), car si nous passons une nouvelle Abc() ici, elle s'appellera encore et encore.

Nous l'utilisons également pour différencier les variables de classe et les variables locales de méthode. par exemple

class Abc {
    int a;

    void setValue(int a)
    {
        this.a = a;
    }
}

Ici this.a Fait référence à la variable a de la classe Abc. D'où le même effet que vous utilisez la nouvelle Abc().a;.

Vous pouvez donc dire que this fait référence à l'objet de la classe actuelle.

10
user291977

Il est courant d'utiliser ce mot-clé dans invocation explicite du constructeur. Vous pouvez voir un exemple de la documentation .

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(0, 0, 1, 1);
    }
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    ...
}
7
public Foo(Bar bar) {
     this.bar = bar;
}

n'est pas la même chose que

public Foo(Bar bar) {
     bar = bar;
}

Dans le second cas, la barre de portée est le paramètre, vous l'assignez donc à elle-même. this.bar reste null.

6
David Soroko

C'est une préférence personnelle - choisissez un style et respectez-le. J'utilise personnellement this mais d'autres pensent que c'est redondant.

3
Andrew Hare

Selon la convention, vous pouvez l'utiliser pour plus de lisibilité. Il souligne le fait qu'il s'agit d'une variable objet.

J'aime aussi avoir des arguments setter avec le même nom que la variable (semble mieux dans la signature de la méthode). Vous avez besoin de this dans ce cas.

3
Konrad Garus

J'essaie toujours d'utiliser le mot clé this sur les objets de classe locaux.

Je l'utilise pour me rappeler visuellement si un objet est un objet statique ou un objet de classe.

Cela m'aide et le compilateur à différencier les arguments de méthode et l'objet de classe locale.

public void setValue(int value){
  this.value = value;
}

Cela m'aide à me rappeler visuellement s'il existe un tel objet local dans une classe interne/imbriquée/anonyme pour le différencier de l'encapsulation d'objets de classe. Parce que s'il n'y a pas de préfixe this, ma convention me rappellera que c'est un objet de la classe encapsulante

public class Hello{
  public int value = 0;
  public boolean modal = false;

  public class Hellee{
    public int value = 1;
    public getValue(){
      if (modal)
        return 0;
      return this.value;
    }
  }
}
2
Blessed Geek
void set(int real)
{
    this.real = real;
}

ici this est un mot clé utilisé lorsqu'il y a une variable d'instance identique à la variable locale.
une autre utilisation de this est la surcharge du constructeur. il peut appeler le constructeur dans un constructeur surchargé.

2
lagnajit

Préférence personnelle, mais je ne l'utilise que pour résoudre des ambiguïtés, et je suppose que dans le cas très rare, il est évident que la variable assignée est un champ. Il existe certains projets où les gens utilisent "this.field" sur chaque référence de champ unique. Je trouve cette pratique distrayante visuellement au point d'être désagréable, mais vous devriez être prêt à voir ce code de temps en temps.

Je pense secrètement qu'il y a une place spéciale en enfer pour les gens qui écrivent 500 classes de ligne qui contiennent 275 mots-clés `` ceci '', mais ce style se trouve dans certains projets open source, donc à chacun son propre je suppose.

1
Decker

Utilisez-le pour cloner des objets (en passant la référence de lui-même via un constructeur de copie).

Utile pour un objet qui hérite de Cloneable.

public Foo implements Cloneable {
  private String bar;

  public Foo(Foo who) {
    bar = who.bar;
  }

  public Object getClone() {
    return new Foo(this);  //Return new copy of self.
  }
}
0
Buhake Sindi