Frage

Warum ist die einzige Klasse java.lang.String für die zwei Arten der Schöpfung existieren:

1) Bei normaler Weise mit "new" Stichwort.

String s = new String("abc");

2) Mit String wörtlichen (die nur mit String Klasse)

verfügbar ist
String s = "abc";

Warum gibt es String Literale und keine Literale für alle anderen Klassen ??

War es hilfreich?

Lösung

String, während eine gewöhnliche Klasse zu sein, stellt eines der Grundelemente der Programmierung (die anderen sind Zahlen und Boolesche Werte). Daher wird Java als String-Objekte als halb primitive Variablen ab dem ersten Tag, und dies erlaubt.

Später, als Auto-Box Teil der Standard-Compiler wurde, können Sie auch numerische Wrapper-Objekte auf diese Weise bauen, d.

Integer i = 123;

als Tom Hawtin-tackline erwähnt in den Kommentaren auf die Frage.

Andere Tipps

Kurze Antwort, weil die Sprachdesigner fühlte sich an wie.

Ich denke, String ist eine solche gemeinsame Klasse, die sie eine Ausnahme gemacht. Ich bin sicher, es gibt ein paar andere ähnliche Ausnahmen wie auch (siehe Tom Hawtins Kommentar)

Abgesehen von Autoboxing (was nicht IMO zählt - die Literale sind für die primitiven Typen statt den Klassen, es gibt nur eine implizite Konvertierung in die Wrapper-Klasse), der String(String) Konstruktor ist tatsächlich nützlich. Es dauert eine Kopie der Zeichendaten, was bedeutet, dass, wenn die Original string ist klein, aber mit einer großen Unterstützung char[], die neue Zeichenfolge ist unabhängig davon.

Dies kann wichtig sein, wenn Sie kurze Zeilen aus einer Datei lesen, zum Beispiel.

Was, warum Stringliterale gibt es: weil sie nützlich sind. Was würden Sie stattdessen? Würden Sie wollen die Entwickler zwingen, zu verwenden:

String x = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });

und zur gleichen Zeit nicht erhalten Internierung?

Was andere Klasse würden Sie wollen eine wörtliche für? Diskutierbar Literale für Karten und Listen nützlich wäre - ich kann mich nicht erinnern, ob sie in Java 7 sind oder nicht kommen. Sie können als „wie eine wörtliche ein bisschen“ von Array initializers denken, dass es eine Abkürzung für Objektinitialisierung ist.

Ich nehme an, weil String wie grundlegenden Datentyp ist, dass sie es auf dem gleichen Niveau wie Primitiven betrachten.

Btw,

new String("abc");

tatsächlich schafft 2 Strings:

  1. die Internierung ein, von denen Sie den Verweis
  2. verlieren
  3. eine neue Instanz mit dem gleichen Inhalt

Ich persönlich habe noch nie eine Notwendigkeit finden String Konstruktor zu verwenden.

Die Objekttypen, die Literale sind Strings , null und Klasse Literale .

Es ist auch möglich, initialisers für Arrays zu verwenden und primitive Literale können auch Objekte verwendet werden, wenn als initialisers verwendet zu schaffen, die die „zwei Möglichkeiten der Schöpfung“ in einfacher Syntax passen, ohne wahren Literale zu sein (sie können nur einen Wert zu initialisieren, anstatt an allen Orten verwendet werden, die ein Objektausdruck kann auftreten).

Wenn Sie andere Techniken wie die Serialisierung und Reflexion, können Sie die „zwei Möglichkeiten der Schöpfung“ brechen.

Java 7 ist geplant, die Fähigkeit zur ursprünglichen Sammlungen über Literale ähnlich wie die Array-Literale zu bieten:

Zuletzt I geprüft:

Integer wInt = 1;

funktioniert gut.

Die letztere Form der Schöpfung beinhaltet auch String Internierung. Das heißt, wenn Sie den Code:

String s = "abc";
String t = "abc";

Der Compiler wird diese optimieren und Sie erhalten zwei Referenzen auf das gleiche String-Objekt. (S == t wird true).

String interning Werke für Streich Ausdrücke zu.

Es gibt natürlich auch Literale für alle primitiven numerischen Typen und die Boolesche Werte wahr und falsch, und Zeichen. Ich denke, man könnte antworten, dass in Ihrer Frage, die Sie technisch sagten „keine Literale für andere Klassen “. Okay. Ich glaube, jemand darauf hingewiesen, dass „null“ ist ein wörtliches Objekt, so dass Ihre Aussage technisch ungenau ist, aber ich denke, das ist das einzige andere Beispiel.

Aber dann die nächste offensichtliche Frage ist, was andere Klassen würden Sie für Literale haben? Wenn Sie die Sprache entwerfen, was wäre ein BufferedReader wörtlichen aussehen? Oder ein ResultSet wörtliche? Oder ein JCheckBox?

Sie könnten theoretisch sagen, dass zum Beispiel eine „wörtliche Datei“ ist der Dateiname in einigen speziellen Trennzeichen wie „$ / home / bob / myfile.txt $“ eingeschlossen. Aber dann könnte jemand sagen, was ist ein JButton, könnten wir nicht eine wörtliche machen, dass wie mit dem Text des Knopfes und der Action es feuert und entsprechende Trennzeichen wie „% Senden, submitListener%“. Und was ist dann mit Sockets, könnten wir nicht die Hostnamen in einigen speziellen Trennzeichen setzen, usw. Ich denke, es ist ziemlich klar, würden wir schnell aus Satzzeichen laufen als Trennzeichen zu verwenden. So würden wir am Ende zu einer Art von Text zu schreiben, um herauszufinden, welche Klasse wir reden, wie Datei-sagen ( „/ home / bob / myfile.txt“) oder Sockel ( „www.example.com“, 631 ). Aber das sieht sehr viel wie ein Konstruktor, und wir würden bald wieder zu dem, was die Autoren von Java tatsächlich getan haben.

Die Zahl der „Dinge“, die rein durch die Natur des Wertes ausgedrückt werden kann (beispielsweise alle Ziffern machen ein numerisches Literal) oder mit Interpunktion ziemlich durch die Anzahl der Satzzeichen begrenzt ist, die reaonably passen auf eine Tastatur sein kann. Und würden Sie eine Tastatur mit 600 speziellen Symbolen für die ganze andere Art von Dingen, die Sie wünschen könnten, darüber zu sprechen? Worte sind so viel einfacher und flexibler.

String wird so häufig verwendet, und Alternativen so ungeschickt gewesen wären, dass es sinnvoll, ein Sonderfall zu machen gemacht.

Stringliterale ist eine bequeme Abkürzung mit einem gut etablierten Vorrang (in C) und Syntax. Wenn die Java-Designer über C ++ Programmierer locken wollte, musste die Stringliterale dort sein. Glücklicherweise ist das String-Handling ist viel vernünftigere in Java als in C ++.

Keine andere Standardobjekte hatten eine De-facto-Syntax - wie würden Sie schreiben eine Karte wörtliche?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top