Ich bin ein C++-Typ, der Java lernt. Ich lese Effective Java und etwas hat mich verwirrt. Es sagt, man solle niemals Code wie diesen schreiben:
String s = new String("silly");
Da es unnötige String
-Objekte erstellt. Stattdessen sollte es so geschrieben werden:
String s = "Nicht mehr albern";
Ok bis hierher ... Aber, gegeben diese Klasse:
public final class CaseInsensitiveString {
private String s;
public CaseInsensitiveString(String s) {
if (s == null) {
throw new NullPointerException();
}
this.s = s;
}
:
:
}
CaseInsensitiveString cis = new CaseInsensitiveString("Polnisch");
String s = "polnisch";
-
Warum ist die erste Aussage in Ordnung? Sollte es nicht sein
CaseInsensitiveString cis = "Polnisch";
-
Wie mache ich
CaseInsensitiveString
so, dass es sich wieString
verhält, damit die obige Aussage in Ordnung ist (mit und ohne Erweiterung vonString
)? Was machtString
zu etwas, das es erlaubt, einfach einen Literal zu übergeben? Nach meinem Verständnis gibt es kein Konzept des "Kopierkonstruktors" in Java?
2 Stimmen
String str1 = "foo"; String str2 = "foo"; Beide str1 und str2 gehören zum selben String-Objekt, "foo", da Java Strings im StringPool verwaltet, sodass eine neue Variable auf denselben String verweist und nicht einen anderen erstellt, sondern den bereits im StringPool vorhandenen zuweist. Aber wenn wir dies tun: String str1 = new String("foo"); String str2 = new String("foo"); Hier gehören sowohl str1 als auch str2 zu verschiedenen Objekten, da new String() zwangsläufig ein neues String-Objekt erstellt.