2010-03-11 18 views
60

Qual è la procedura migliore per utilizzare la parola chiave this in Java? Ad esempio, ho la seguente classe:Java: quando utilizzare la parola chiave "this"

class Foo { 
    Bar bar; 

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

va bene e tutto, ma Java è abbastanza intelligente per sapere cosa sta succedendo se cambio l'affermazione nel costruttore per

bar = bar; 

Allora perché l'uso la parola chiave this? (Mi rendo conto che in alcune situazioni è assolutamente necessario usarlo, sto solo chiedendo situazioni come questa). In realtà, io tendo a usare la parola chiave puramente per motivi di leggibilità, ma qual è la pratica comune? Usandolo in tutto il negozio fa il mio codice sembrare un po 'disordinato, ad esempio

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

Ovviamente un povero pezzo di codice ma illustra il mio esempio. È solo in base alle preferenze personali in questi casi?

+3

La stessa domanda è stata pubblicata 2 giorni fa: http://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class Ci sono tra l'altro più creduloni: http://www.google.com/search?q=java+when+use+this+keyword+site%3Astackoverflow.com – BalusC

+0

Il mio male, ho avuto una ricerca (chiaramente molto) rapida utilizzando la ricerca SO ma non trova qualcosa ... – jackbot

+0

Come altri hanno sottolineato, stai eseguendo l'assegnazione a self (parametro) sopra. Ma la mia regola generale è usare 'this' quando rende il programma più * leggibile *. Se usi un qualche tipo di convenzione di denominazione per le variabili membro (ad es. '_bar' o' mBar'), scrivere 'this._bar' è solo un rumore extra, IMHO. –

risposta

69

ma Java è abbastanza intelligente per sapere cosa sta succedendo se cambio l'affermazione nel costruttore per

bar = bar; 

FALSO! Compila ma non fa quello che pensi che faccia!

Per quanto riguarda quando usarlo, molte sono le preferenze personali. Mi piace usare lo this nei miei metodi pubblici, anche quando non è necessario, perché è lì che avviene l'interfacciamento ed è bello affermare ciò che è mio e ciò che non lo è.

come riferimento, è possibile controllare Tutorial Java della Oracle conoscere this.subject ;-)

http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

+11

Ecco perché mi piace contrassegnare tutte le variabili dei parametri come finali. – crowne

+0

sì riassegna semplicemente la barra variabile nel contructor a se stessa. Questo perché la barra è già definita nell'oscilloscopio e sostituisce quella della barra. –

3

È una preferenza personale: scegliere uno stile e attenersi ad esso. Io personalmente uso this ma altri pensano che sia ridondante.

3

A seconda convenzione, lo si può utilizzare per migliorare la leggibilità. Sottolinea il fatto che si tratta di una variabile oggetto.

Mi piace anche avere argomenti setter con lo stesso nome della variabile (sembra migliore nella firma del metodo). In questo caso è necessario this.

11

realtà

baz = baz 

alzerà questo avvertimento

L'assegnazione di Baz variabile non ha effetto

Quindi, ciò che si pensa è sbagliato, l'ambito locale sovrascrive la classe attributo quindi DEVE utilizzare this keywo in modo esplicito per assegnare la variabile all'attributo class.

In caso contrario, la variabile conteggiata nell'assegnazione è solo quella passata come parametro e quella di classe viene ignorata.Ecco perché this è utile, non è un fatto di leggibilità, è un fatto di decidere esplicitamente di cui stai parlando baz.

direi

uso this laddove non lo si utilizza causerebbe ambiguità (o avviso del compilatore, che sono più importanti), altrimenti solo lasciare. Dal momento che il suo scopo è esattamente quello di risolvere le ambiguità quando le assunzioni di default (prima controlla la gente del posto, quindi controlla gli attributi della classe) non sono sufficienti.

12

Si dovrebbe usare quando si ha un parametro con lo stesso nome di un campo, altrimenti si incontreranno problemi. Compilerà, ma non farà necessariamente quello che vuoi.

Come altrove, non utilizzarlo a meno che non sia necessario per motivi di leggibilità. Se lo usi ovunque, il 20% del tuo codice sarà composto dalla parola "questo"!

+0

Sebbene sia discutibile che la parola chiave esplicita 'this' ovunque possa essere utile. Linguaggi come Python e Rust lo richiedono di fatto ('self'), e non ho mai visto questo esplicito come negativo. – phoenix

+0

Risposta brillante, breve, concisa, al punto –

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

non è la stessa

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

Nel secondo caso la barra nel campo di applicazione è il parametro, quindi si assegna a se stesso. this.bar rimane null.

1

Preferenza personale, ma la utilizzo per risolvere solo le ambiguità e suppongo, nel caso molto raro, che sia ovvio che la variabile assegnata è un campo. Ci sono alcuni progetti in cui le persone usano "this.field" su ogni singolo riferimento di campo. Trovo questa pratica visivamente distraente al punto di essere odiosa, ma dovresti essere pronto a vedere un tale codice una volta ogni tanto.

Penso segretamente che ci sia un posto speciale all'inferno per le persone che scrivono 500 classi di linea che contengono 275 "queste" parole chiave, ma questo stile si trova in alcuni progetti open source, quindi a ciascuno il suo credo.

+0

+1 Se trova utilizzando questo. * Ovunque molto fastidioso.Se stai utilizzando un IDE moderno e classi di progettazione correttamente, non ti imbatterai mai in una situazione in cui devi capire a cosa si riferisce la variabile (attributo, variabile locale ecc.) – helpermethod

2

Provo sempre a utilizzare la parola chiave this su oggetti di classe locale.

Lo uso per ricordarmi visivamente se un oggetto è oggetto statico o oggetto di classe.

Aiuta me e il compilatore a distinguere tra argomenti del metodo e oggetto di classe locale.

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

Mi aiuta a ricordarmi visivamente se v'è un oggetto così locale in una classe interna/annidata/anonima per differenziarlo da incapsulare oggetti di classe. Perché non this se v'è prefisso, il mio convegno mi ricordano che si tratta di un oggetto della classe incapsulante

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; 
    } 
    } 
} 
10

this parola chiave si riferisce alla oggetto della classe su cui viene invocato un metodo.
Per esempio:

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(); 
    } 
} 

Qui in Abc() stiamo chiamando Xyz() che ha bisogno Oggetto della Abc classe .. Così possiamo passare this invece di nuovo Abc(), perché se si passa nuovo Abc() qui sarà chiamarsi ancora e ancora.

Inoltre lo usiamo per differenziare le variabili di classe e le variabili locali del metodo. es

class Abc { 
    int a; 

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

Qui this.a è riferisce ad un variabile di classe Abc. Quindi avere lo stesso effetto quando usi nuovo Abc().a;.

Quindi si può dire che this si riferisce all'oggetto della classe corrente.

0

Utilizzarlo per la clonazione di oggetti (passando il riferimento di sé attraverso un costruttore di copie).

Utile per l'oggetto che eredita 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. 
    } 
} 
2
void set(int real) 
{ 
    this.real = real; 
} 

qui this è una parola chiave utilizzata quando v'è variabile istanza è uguale alla variabile locale.
un altro utilizzo di this è il sovraccarico del costruttore. può chiamare il costruttore in un costruttore sovraccarico.

7

E 'comune l'uso di questo parola chiave in esplicito costruttore invocazione. È possibile visualizzare un esempio da 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; 
    } 
    ... 
} 
Problemi correlati