Quando si confronta una variabile di stringa con una stringa letterale con .equals (), esiste una pratica standard per l'ordine degli articoli? [chiuso]


11

Ci sono vantaggi per ciascuno e capisco le differenze, ma quale è considerata la migliore / pratica standard? E perché?

Per esempio :

"myString".equals(myStringVar)
  • Evita un potenziale NPE e non richiede un controllo nullo. (Buona cosa?)
  • Più pulito da leggere poiché non è richiesto un controllo null.
  • Se null non è un valore atteso, il tuo programma potrebbe essere interrotto senza essere più saggio.

tuttavia

myStringVar.equals("myString")
  • Richiede un controllo null se null è un valore previsto. (Buona cosa?)
  • Può ingombrare i condizionali composti con controlli nulli.
  • Consente a NPE di farci sapere se qualcosa si è rotto.

Quale variante è considerata lo standard da utilizzare per Java e perché?


2
Indipendentemente dal fatto che null sia un valore atteso, l'operazione "uguale" dovrebbe essere il posto giusto per determinare se questo è un problema?
Matthew Flynn,

Non penso lo sia. Ma quella è la mia opinione. Mi piacerebbe sentire la logica degli altri.
BrandonV,

Nelle lingue che usano = e / o == per incarichi / confronti, di solito è buona prassi mettere la cosa che non può cambiare a sinistra in modo da non poter fare un incarico accidentale quando intendevi fare un confronto. Per i linguaggi che usano metodi su un oggetto come .equals non penso che sia importante.
GordonM,

Risposte:


3

Ho il sospetto che ciò provenga da una precauzione di sicurezza utilizzata durante la programmazione in C (o C ++) precedente. In C, potresti accidentalmente assegnare un valore quando intendi testare l'uguaglianza:

if (x = 3)

Questa condizione sarà sempre vera, dal momento che è l'assegnazione x un valore di 3, non testando che x è uguale a 3. Per evitare questi bug sottili, gli sviluppatori hanno iniziato a invertire la condizione:

if (3 = x)

Questo contiene lo stesso "bug", ma genererà un errore del compilatore, quindi è più sicuro.

Le lingue più moderne non hanno questo problema e possono avvisarti facilmente quando provi a fare questo genere di cose. Come tale, non è praticamente una preferenza pura, quindi scegline una e usala in modo coerente.


-1 Questo non è il motivo della convenzione Java per equals. A differenza di C, il problema per Java è che l'espressione x.equals(y)genererà un NPE quando xè null. Se hai un valore letterale String "something"e vuoi considerare il caso null"non uguale", ha senso scrivere "something".equals(y)se non sai se ypuò essere nullo. Questo non genererà mai un NPE.
Andres F.

1
  • Lo standard e le buone pratiche variano a seconda della cultura di un'organizzazione per cui stai lavorando

  • Il nostro standard in .NET è myStringVar == "myString"semplicemente perché ci siamo accordati, ovvero crediamo che sia pulito e conciso

Nota: questo non si applica a Java a causa del ==confronto tra i riferimenti anziché gli oggetti stessi. In Java dovresti usare myStringVar.equals("myString").


3
Almeno in Java, non usare ==perché confronta solo i riferimenti agli oggetti. Detto questo, +1 per il setimento - la convenzione spesso definisce il modo "giusto" di fare le cose.
Michael K,

Grazie per averlo segnalato! Ho aggiornato la risposta :)
CodeART

@CodeWorks: penso che ti sia sfuggito il punto di Michael. Inoltre, è Java non JAVA.
amara,

La domanda era: "ma che cosa è considerata la migliore / pratica standard? Perché?" La mia risposta è che lo standard e le migliori pratiche variano da un'organizzazione all'altra. Non sei d'accordo con quello?
CodeART

@CodeWorks: nessuno potrebbe non essere d'accordo, CodeWorks. Ma tutti potrebbero essere d'accordo sul fatto che myStringVar == "myString"è una cattiva idea su Java (a meno che tu non sia assolutamente sicuro che myStringVarsia internato).
amara,

0

Penso che tu abbia ragione in quanto dipende dalla semantica di nullità della variabile. Se non ti aspetti che sia nullo e non devi cercarlo e gestirlo, il primo modulo è più pulito.

Detto questo, piuttosto che incorporare la stringa letterale, un'opzione migliore sarebbe probabilmente questa:

private final String MY_STRING = "myString";
if(MY_STRING).equals(myStringVar);

Soprattutto se esiste la possibilità di utilizzare la stringa in più posizioni di una.


2
-1: non effettivamente migliore; aggiunge disordine con un valore generalmente trascurabile
Amara

@sparkleshy - Non sei d'accordo, non vuoi davvero che i letterali di stringa vengano sparsi attraverso la tua logica del codice. Come accennato nella risposta originale, se il valore letterale della stringa viene utilizzato in più punti di uno, direi sicuramente di rifattorizzarli.
Benjamin Wootton,

Per dirlo, devi analizzare in modo approfondito Python, poiché in Python gli identificatori sono fondamentalmente letterali stringa. E penso che tutti dobbiamo essere d'accordo sul fatto che Python sia un bel linguaggio.
amara,
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.