Qual è lo stile accettato per usare la parola chiave `this` in Java?


37

Vengo da linguaggi come Python o Javascript (e altri meno orientati agli oggetti) e sto cercando di migliorare la mia conoscenza operativa di Java, che conosco solo in modo superficiale.

È considerata una cattiva pratica anteporre sempre thisagli attributi dell'istanza corrente? Mi sembra più naturale scrivere

...
private String foo;

public void printFoo() {
    System.out.println(this.foo);
}
...

di

...
private String foo;

public void printFoo() {
    System.out.println(foo);
}
...

poiché mi aiuta a distinguere gli attributi di istanza dalle variabili locali.

Ovviamente in un linguaggio come Javascript ha più senso usare sempre this, poiché si può avere più annidamenti di funzioni, quindi variabili locali provenienti da ambiti più ampi. In Java, per quanto ho capito, non è possibile nidificare in questo modo (tranne che per le classi interne), quindi probabilmente non è un grosso problema.

In ogni caso, preferirei usare this. Sarebbe strano e non idiomatico?


Usiamo uno strumento per stadiarizzarlo nella nostra azienda. Lo strumento rerita il codice con il nostro senza questo a seconda della politica aziendale. Quindi tutti programmano come preferiscono e il codice viene formattato nel modo giusto al momento del commit.
deadalnix,

2
"dal momento che si può avere una maggiore nidificazione delle funzioni, quindi variabili locali provenienti da ambiti più grandi." Inoltre, il fatto che "questo" non sia effettivamente uno dei luoghi da cui una variabile non qualificata può provenire da una funzione in JS.
Casuale 832

2
Prefisso tutte le variabili di istanza con trattino basso in modo da poter facilmente dire la differenza tra variabili locali e di istanza senza usare this.
WuHoUnited,

4
In C # StyleCop ti vuole mettere this.quando ti riferisci a variabili membro, metodi, ecc. Mi piace, sono d'accordo con questa regola. Penso che sia meglio che nominare qualcosa con un trattino basso all'inizio. Seguirei la stessa regola se scrivessi in Java.
Giobbe

Risposte:


40

Nella maggior parte degli IDE, puoi semplicemente passare il mouse sopra la variabile se vuoi sapere. Inoltre, davvero, se stai lavorando con un metodo di istanza, dovresti davvero conoscere tutte le variabili coinvolte. Se ne hai troppi o i loro nomi si scontrano, allora devi fare il refactoring.

È davvero abbastanza ridondante.


7
Inoltre: un IDE sano dovrebbe rendere visivamente distinti campi e variabili / parametri locali. Ad esempio in Eclipse (per impostazione predefinita) i campi sono blu, mentre le variabili locali sono nere.
Joachim Sauer,

1
@Joachim Bel punto, Eclipse può persino colorare i parametri e le variabili locali in modo diverso se l'utente lo desidera (questo non è di default comunque).
Eric-Karl,

3
Anche se sono d'accordo, trovando il codice di altri sviluppatori (e pur non conoscendo a prima vista) trovo this.molto più utile. Questo probabilmente anche perché non ho un IDE che codifica in modo diverso le variabili locali / oggetto.
Brad Christie,

3
+1 per (parafrasi) "refactoring, se avete bisogno di utilizzare questo dedurre che si tratta di un membro". Proprio quello che volevo sottolineare.
Yam Marcovic,

Non trovo che sia più difficile da leggere e, in cambio, il codice rimane leggibile negli editor che hanno un evidenziatore della sintassi meno sofisticato che non distingue tra campi e locali. Ho sempre avuto l'opinione che dovresti sforzarti che il tuo codice sia facilmente leggibile nell'editor di testo più semplice, e se non lo è, dovrebbe esserci una buona ragione per farlo.
Kevin,

26

Preferisco usare this. Semplifica la lettura del codice in vari editor che colorano le variabili locali e di istanza allo stesso modo. Inoltre, semplifica la lettura del codice su una pagina stampata durante una revisione del codice. È anche un promemoria abbastanza forte per quanto riguarda l'ambito della variabile per altri sviluppatori.

Tuttavia, ci sono argomenti contro questo. Nei moderni IDE, puoi scoprire l'ambito di una variabile passando con il mouse sopra di essa o visualizzandola in una struttura ad albero. Puoi anche cambiare il colore e / o la faccia del carattere delle variabili a seconda del loro ambito (anche in modo tale che, una volta stampato, sia evidente quale sia lo scopo della variabile).

Credo che l'ultima frase di ChrisF sia morta: sii coerente nel tuo utilizzo.


7
"È anche un promemoria abbastanza forte per quanto riguarda l'ambito della variabile per gli altri sviluppatori." - il motivo che tendo a usare e mi piace vedere this.nel codice. Richiede mezzo secondo per scrivere e può risparmiare lunghi minuti quando si deve capire se l'uomo prima di te intendeva davvero usare la proprietà del caso pascal invece del caso del caso cammello lì quando ha fatto quell'ultimo minuto scoppiare di modifiche 20 revisioni fa.
scrwtp,

18

Un posto che uso costantemente "questo" è setter eo costruttori:

public void setFoo(String foo) {
    this.foo = foo;
}

A parte questo, non credo sia necessario aggiungerlo. Quando si legge il corpo di un metodo, i parametri e i locali sono proprio lì - e abbastanza facili da tenere traccia (anche senza l'aiuto dell'IDE). Anche i locali e i campi tendono ad essere di natura diversa (stato dell'oggetto o memoria o parametro transitorio).

Se c'è confusione su cosa sia una variabile e cosa sia un campo, probabilmente significa che un metodo ha troppe variabili / parametri, è troppo lungo e troppo complesso e dovrebbe essere semplificato.

Se scegli di usare 'questo' per taggare i campi, ti consiglio di assicurarti che la convenzione sia sempre seguita rigorosamente - sarebbe davvero facile iniziare a dare per scontato che non 'questo' significhi che è un locale e rompere le cose in base al presupposto.

modifica: finisco anche per usarlo in uguale a, clone o qualsiasi cosa che abbia un parametro 'that' dello stesso tipo di oggetto:

public boolean isSame(MyClass that) {
    return this.uuid().equals(that.uuid());
}

8

È discutibile.

Prendendo C # come un'analogia in quanto ha una sintassi e una struttura molto simili a Java, troviamo che C # StyleCop ha una regola predefinita che insiste sull'aggiunta this, ma ReSharper ha una regola predefinita che dice che thisè ridondante (quale è) e può essere rimosso.

Quindi se stai usando uno strumento, li aggiungerai, ma se ne usi un altro, li rimuoverai. Se stai utilizzando entrambi gli strumenti, dovrai scegliere e disabilitare una delle regole.

Tuttavia, ciò che significano le regole è che sei coerente nel tuo utilizzo - che è probabilmente la cosa più importante.


8

È considerato una cattiva pratica anteporre sempre questo agli attributi dell'istanza corrente?

Sì - da alcuni, no - da altri.

Mi piace e utilizzo la thisparola chiave nei miei progetti in Java e C #. Si può sostenere che IDE metterà sempre in evidenza parametri e campi di colore diverso, tuttavia non sempre si lavora in IDE - dobbiamo fare molte fusioni / differenze / alcune modifiche rapide in un blocco note / controllare alcuni frammenti di codice nell'e-mail . È molto più facile per me individuare fin dalla prima occhiata in cui viene modificato lo stato dell'istanza, ad esempio esaminare alcuni possibili problemi di concorrenza.


7

Penso che se hai bisogno di usare questo, hai un metodo troppo lungo, o una classe che sta provando a fare troppo, o entrambi.

I metodi non dovrebbero mai essere più lunghi di poche righe di codice, usare una o due variabili locali, determinando cosa diventa facile; anche con solo il contesto a 3 righe della maggior parte degli strumenti diff. Se i tuoi metodi sono troppo lunghi e le tue classi hanno troppe responsabilità (spesso significano troppi campi), la soluzione è invece dividerle.

Penso che "questo" ingombra solo il codice. Soprattutto con gli IDE moderni che colorano i parametri locali / variabili / campi locali in modo diverso.


5

Penso che tu abbia risposto alla tua domanda con questo:

Mi sembra più naturale scrivere

... this.foo ...

di

... foo ...

poiché mi aiuta a distinguere gli attributi di istanza dalle variabili locali.

Se ti senti più a tuo agio nell'utilizzare this.migliorando le tue conoscenze lavorative con Java, allora usa sicuramente la cosa ( penso che sia, in un certo senso, il familiare sé Python a cui ti stai relazionando ).

Il fatto è che, sebbene le persone forniranno argomenti solidi / pertinenti sull'uso o non sull'uso this., sembra comunque un dibattito, ad esempio:

  • rende chiaro lo scopo delle variabili vs. dovresti riscrivere il codice se non è chiaro quale sia ciascuna variabile;
  • this.è ridondante se trascorri l'intera giornata nell'IDE rispetto a quando eseguo revisioni del codice e fai diff su diverse versioni utilizzando un comparatore senza evidenziazione della sintassi;
  • non digitare this.mi guadagna importanti millisecondi di produttività rispetto a quando vengo pagato con il tasto premuto e l'aggiunta this.è come un aumento di stipendio: D;
  • ecc ecc

Ma la linea di fondo è che alla fine della giornata riprende ancora con le preferenze personali e l'ambiente di lavoro .


5

Normalmente aggiungere questo non è necessario. Non penso che sia una cattiva pratica di per sé, ma un uso eccessivo di questo sarebbe probabilmente considerato insolito nella maggior parte delle basi di codice Java che ho visto.

Tuttavia lo trovo prezioso in un paio di situazioni specifiche:

Sostituzione dei parametri locali : a volte è necessario specificare che si desidera utilizzare una variabile di istanza anziché un parametro / variabile locale con lo stesso nome. Questo è abbastanza comune nei costruttori, dove si desidera che il nome del parametro corrisponda al nome interno della variabile di istanza che viene utilizzato per inizializzare, ad es.

class MyObject {
  int value;

  public MyObject(int value) {
    this.value=value;
  }
}

Quando gestiamo altre istanze della stessa classe , credo che renda il codice più chiaro e comprensibile per essere esplicito a quale istanza della classe a cui ti riferisci, ad es.

class MyObject {
  int value;
  ....

  public MyObject add(MyObject other) {
    return new MyObject( this.value + other.value )
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.