Hallo, ich bin jetzt drauf gestoßen, dass ich in einer Methode nur Integer.toString(x) statt x.toString() verwenden kann. Was ist da der Unterschied?
x steht für ein Integer.
Ich übergebe in einer Methode ein Integer und möchte den in einen String später umwandeln.
Gruß
Kein Unterschied. Die Methode Integer.toString() ruft intern die Metode Integer.toString(int) auf.
Allerdings solltest du, wo immer möglich, den primitiven Datentyp int, anstatt von Integer (die Wrapper-Klasse) verwenden, um die unnötige Erzeugung von Objekten zu vermeiden.
Wenn die Variable vom Typ Integer ist, dann kannst Du auch x.toString() verwenden. Wenn x aber nur ein int ist, dann ist es ein Value Typ und damit ist x keine Referenz auf eine Instanz. Keine Referenz bedeutet: Es lassen sich darauf keine Methoden aufrufen.
Wenn die Variable vom Typ Integer ist, dann kannst Du auch x.toString() verwenden. Wenn x aber nur ein int ist, dann ist es ein Value Typ und damit ist x keine Referenz auf eine Instanz. Keine Referenz bedeutet: Es lassen sich darauf keine Methoden aufrufen.
Anbei der Beispielcode, wo nur Integer.toString(x) funktionier (siehe Zeile 4).
Java:
classZahl{Stringtester(int x){String s;
s =Integer.toString(x);//x.toString() geht nichtreturn s;}}publicclassTest{publicstaticvoidmain(String[] args){Zahl y =newZahl();String ff;
ff = y.tester(5);System.out.println(ff);}}
Das war ja, was ich bei der Erläuterung gemeint habe: Der Parameter x ist vom Typ int.
Du kannst Methoden doch nur auf Referenzen aufrufen, da Referenzen auf Objekte/Instanzen verweisen! Wenn Du als Typ Integer hättest, dann könntest Du da auch toString aufrufen: String tester(Integer x){
Aber dann kannst Du d auch null übergeben, also evtl. nicht das, was Du willst.
Generell gibt es auch eine automatische Umwandlung wenn bei der Addition ein Parameter ein String ist. Also ein einfaches "" + x reicht zur einfachen Umwandlung bereits.
Generell ist für sowas String.valueOf meistens am sinnvollsten, das ist für alle Typen überladen und ist nullsafe, was für die Methoden von Integer nicht gilt.
Generell ist für sowas String.valueOf meistens am sinnvollsten, das ist für alle Typen überladen und ist nullsafe, was für die Methoden von Integer nicht gilt.
Generell ist für sowas String.valueOf meistens am sinnvollsten, das ist für alle Typen überladen und ist nullsafe, was für die Methoden von Integer nicht gilt.
Und jetzt ändert irgendwer den Typen zu Integer, läuft durch Autoboxing weiter ohne Probleme, bis dann null übergeben wird und die NPE fliegt.
Und mir String.valueOf hat man zusätzlich den Vorteil, das es überall gleich ist, wenn man sich darauf festlegt vermeidet man den Mischmasch aus 4 verschiedenen Varianten pro Typ.
Bewirken tun die nichts, das sind nur IntelliJs Hinweise, dass die Methode niemals null zurück gibt (was bei toString uä auch Unsinn wäre) und niemals den Zustand verändert.
eine annotation tut an sich nichts "selbst" .. zb die FXML annotation ist einfach nur die klasse und sonst nix drin, diese wird dann durch reflektion und sonst was einen "sinn"gegeben
eine annotation tut an sich nichts "selbst" .. zb die FXML annotation ist einfach nur die klasse und sonst nix drin, diese wird dann durch reflektion und sonst was einen "sinn"gegeben
Und jetzt ändert irgendwer den Typen zu Integer, läuft durch Autoboxing weiter ohne Probleme, bis dann null übergeben wird und die NPE fliegt.
Und mir String.valueOf hat man zusätzlich den Vorteil, das es überall gleich ist, wenn man sich darauf festlegt vermeidet man den Mischmasch aus 4 verschiedenen Varianten pro Typ.
Genau aus dem Grund verwende ich String.valueOf() in der Regel ungern Ich will eine Exception und keinen String "null", der dann still und heimlich irgendwo landet und dann irgendwo/-wann anders zum Problem führt (ja, ich weiß, sollte beim Test auffallen).
Genau aus dem Grund verwende ich String.valueOf() in der Regel ungern Ich will eine Exception und keinen String "null", der dann still und heimlich irgendwo landet und dann irgendwo/-wann anders zum Problem führt (ja, ich weiß, sollte beim Test auffallen).
Stimmt, ist je nachdem wo man das benutzt vielleicht doch sinnvoller.
Ich hab zu viel an meinen üblichen Anwendungsfall gedacht, das ist meistens in toString oder Log-Ausgaben oder an ähnlichen "internen" Stellen, da will ich explizit keine Exception. Aber ja, an allen anderen Stellen würd ich die NPE auch bevorzugen.
Any type may be converted to type String by string conversion.
A value x of primitive type T is first converted to a reference value as if by giving it as an argument to an appropriate class instance creation expression (§15.9):
Now only reference values need to be considered:
If the reference is null, it is converted to the string "null" (four ASCII characters n, u, l, l).
Otherwise, the conversion is performed as if by an invocation of the toString method of the referenced object with no arguments; but if the result of invoking the toString method is null, then the string "null" is used instead.
Der Unterschied, der hier halt intern ist, ist die Erstellung einer Instanz, die bei der String Concatenation auftritt (so wirklich exakt so vorgegangen wird und intern nicht einfach ein String.valueOf ausgeführt wird. Hier würde ich prinzipiell bei der genauen Implementation diese Optimierung erwarten. Aber ich habe jetzt kein Bytecode analysiert.)
Der Unterschied, der hier halt intern ist, ist die Erstellung einer Instanz, die bei der String Concatenation auftritt (so wirklich exakt so vorgegangen wird und intern nicht einfach ein String.valueOf ausgeführt wird. Hier würde ich prinzipiell bei der genauen Implementation diese Optimierung erwarten. Aber ich habe jetzt kein Bytecode analysiert.)
Wenn es um Ausgaben geht, ist es in Projekten oft so, dass eben eine Nachricht aus Ressourcen zusammen gesetzt wird um die Ausgaben anzupassen. Und da läuft es dann bei mir auf java.text.MessageFormat hinaus. (Hier wird auf Argumente über die Position zugegriffen. Es können also Werte in beliebiger Reihenfolge und Anzahl verwendet werden. Bei Übersetzungen / Anpassungen an Kundenwünsche kann das durchaus Sinnvoll sein.) Und da wird dann auch nichts in String umgewandelt, denn da will man ggf. auch Formatierungen haben.