Gibt es beim Vergleichen einer Zeichenfolgenvariablen mit einem Zeichenfolgenliteral mit .equals () eine Standardpraxis für die Reihenfolge der Elemente? [geschlossen]

11

Jeder hat Vorteile und ich verstehe die Unterschiede, aber was wird als Best / Standard Practice angesehen? Und warum?

Zum Beispiel :

"myString".equals(myStringVar)
  • Vermeidet eine potenzielle NPE und erfordert keine Nullprüfung. (Gute Sache?)
  • Sauberer zu lesen, da keine Nullprüfung erforderlich ist.
  • Wenn null kein erwarteter Wert ist, kann Ihr Programm unterbrochen werden, ohne klüger zu sein.

jedoch

myStringVar.equals("myString")
  • Erfordert eine Nullprüfung, wenn null ein erwarteter Wert ist. (Gute Sache?)
  • Kann zusammengesetzte Bedingungen mit Nullprüfungen überladen.
  • Ermöglicht NPE, uns mitzuteilen, ob etwas kaputt gegangen ist.

Welche Variante wird als Standard für Java angesehen und warum?

BrandonV
quelle
2
Ob null ein erwarteter Wert ist oder nicht, sollte die Operation "gleich" der Ort sein, an dem festgestellt wird, dass dies ein Problem ist?
Matthew Flynn
Ich glaube nicht. Aber das ist meine Meinung. Ich würde gerne die Gründe anderer hören.
BrandonV
In Sprachen, die = und / oder == für Aufgaben / Vergleiche verwenden, ist es normalerweise empfehlenswert, das, was sich nicht ändern kann, links zu platzieren, damit Sie keine versehentliche Aufgabe ausführen können, wenn Sie einen Vergleich durchführen möchten. Für Sprachen, die Methoden für ein Objekt wie .equals verwenden, denke ich nicht, dass es wichtig ist.
GordonM

Antworten:

3

Ich vermute, dass dies auf eine Sicherheitsvorkehrung zurückzuführen ist, die beim Programmieren in älterem C (oder C ++) angewendet wird. In C könnten Sie versehentlich einen Wert zuweisen, wenn Sie die Gleichheit testen möchten:

if (x = 3)

Diese Bedingung ist immer erfüllt, da die Zuweisung xa den Wert 3 hat und nicht testet, dass x gleich 3 ist. Um diese subtilen Fehler zu vermeiden, haben Entwickler begonnen, die Bedingung umzukehren:

if (3 = x)

Dies enthält den gleichen "Fehler", generiert jedoch einen Compilerfehler, sodass es sicherer ist.

Moderne Sprachen haben dieses Problem nicht und können Sie leicht warnen, wenn Sie versuchen, solche Dinge zu tun. Als solches ist es keine ziemlich reine Präferenz, also wählen Sie eine aus und verwenden Sie sie konsequent.

Oleksi
quelle
-1 Dies ist nicht der Grund für die Java-Konvention für equals. Im Gegensatz zu C besteht das Problem bei Java darin, dass der Ausdruck x.equals(y)eine NPE auslöst, wenn er xnull ist. Wenn Sie ein String-Literal haben "something"und den Fall nullals "nicht gleich" betrachten möchten , ist es sinnvoll zu schreiben, "something".equals(y)wenn Sie nicht wissen, ob ynull sein kann. Dies wird niemals eine NPE werfen.
Andres F.
1
  • Standard und bewährte Verfahren variieren je nach Unternehmenskultur, für die Sie arbeiten

  • Unser Standard in .NET ist myStringVar == "myString"einfach, weil wir uns darauf geeinigt haben, dh wir glauben, dass es sauber und präzise ist

Hinweis: Dies gilt nicht für Java, da ==die Referenzen anstelle der Objekte selbst verglichen werden. In Java sollten Sie verwenden myStringVar.equals("myString").

CodeART
quelle
3
Zumindest in Java nicht verwenden, ==da nur Objektreferenzen verglichen werden. Das heißt, +1 für die Setzungskonvention definiert oft die "richtige" Art, Dinge zu tun.
Michael K
Vielen Dank für den Hinweis! Ich habe die Antwort aktualisiert :)
CodeART
@ CodeWorks: Ich denke, Sie haben Michaels Punkt verfehlt. Es ist auch Java, nicht JAVA.
Amara
Die Frage war: "Aber was wird als Best / Standard-Praxis angesehen? Warum?" Meine Antwort lautet, dass Standard und Best Practice von Organisation zu Organisation unterschiedlich sind. Sind Sie damit nicht einverstanden?
CodeART
@ CodeWorks: Niemand kann dem widersprechen, CodeWorks. Aber jeder könnte zustimmen, dass dies myStringVar == "myString"eine zutiefst schlechte Idee für Java ist (es sei denn, Sie sind absolut sicher, dass myStringVares intern ist).
Amara
0

Ich denke, Sie haben Recht damit, dass es von der Nullheitssemantik der Variablen abhängt. Wenn Sie nicht erwarten, dass es null ist, und nicht danach suchen und damit umgehen müssen, ist das erste Formular sauberer.

Das heißt, anstatt das String-Literal einzubetten, wäre eine bessere Option wahrscheinlich folgende:

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

Insbesondere, wenn die Möglichkeit besteht, die Zeichenfolge an mehreren Stellen zu verwenden.

Benjamin Wootton
quelle
2
-1: eigentlich nicht besser; fügt Unordnung mit normalerweise vernachlässigbarem Wert hinzu
amara
@sparkleshy - Nicht einverstanden, Sie möchten wirklich nicht, dass String-Literale durch Ihre Codelogik gestreut werden. Wie in der ursprünglichen Antwort erwähnt, würde ich definitiv sagen, wenn das String-Literal an mehreren Stellen verwendet wird, um sie zu überarbeiten.
Benjamin Wootton
Um das zu sagen, müssen Sie Python gründlich auflösen, da in Python Bezeichner im Grunde String-Literale sind. Und ich denke, wir müssen uns alle einig sein, dass Python eine gute Sprache ist.
Amara