Warum kann ich die switch-Anweisung nicht für einen String verwenden?


1004

Wird diese Funktionalität in eine spätere Java-Version integriert?

Kann jemand erklären, warum ich das nicht tun kann, wie in der technischen Art und Weise, wie Javas switchAussage funktioniert?


195
Es ist in SE 7. 16 Jahre nach seiner Anfrage. download.oracle.com/javase/tutorial/java/nutsandbolts/…
wütendITguy

81
Sun war ehrlich in ihrer Bewertung: "Don't hold your breath."lol, bugs.sun.com/bugdatabase/view_bug.do?bug_id=1223179
Raffian

3
@raffian Ich denke, das liegt daran, dass sie zweimal 'seufzte'. Nach fast 10 Jahren waren sie auch etwas spät dran, um zu antworten. Dann hätte sie vielleicht ihren Enkelkindern Lunchboxen packen können.
WeirdElfB0y

Antworten:


1004

Switch-Anweisungen mit StringFällen wurden in Java SE 7 mindestens 16 Jahre nach ihrer ersten Anforderung implementiert . Ein klarer Grund für die Verzögerung wurde nicht angegeben, hatte aber wahrscheinlich mit der Leistung zu tun.

Implementierung in JDK 7

Die Funktion wurde jetzt javac mit einem "Entzuckern" -Verfahren implementiert. Eine saubere Syntax auf hoher Ebene unter Verwendung von StringKonstanten in caseDeklarationen wird zur Kompilierungszeit nach einem Muster zu komplexerem Code erweitert. Der resultierende Code verwendet JVM-Anweisungen, die immer vorhanden waren.

A switchmit StringFällen wird während der Kompilierung in zwei Schalter übersetzt. Der erste ordnet jede Zeichenfolge einer eindeutigen Ganzzahl zu - ihrer Position im ursprünglichen Schalter. Dies erfolgt, indem zuerst der Hash-Code des Etiketts eingeschaltet wird. Der entsprechende Fall ist eine ifAnweisung, die die Zeichenfolgengleichheit testet. Wenn der Hash kollidiert, ist der Test eine Kaskadierung if-else-if. Der zweite Schalter spiegelt dies im ursprünglichen Quellcode wider, ersetzt jedoch die Fallbezeichnungen durch die entsprechenden Positionen. Dieser zweistufige Prozess macht es einfach, die Flusskontrolle des ursprünglichen Schalters beizubehalten.

Schalter in der JVM

Weitere technische Informationen switchfinden Sie in der JVM-Spezifikation, in der die Zusammenstellung von switch-Anweisungen beschrieben wird. Kurz gesagt, es gibt zwei verschiedene JVM-Anweisungen, die für einen Switch verwendet werden können, abhängig von der Sparsamkeit der von den Fällen verwendeten Konstanten. Beide hängen von der Verwendung ganzzahliger Konstanten für jeden Fall ab, um eine effiziente Ausführung zu gewährleisten.

Wenn die Konstanten dicht sind, werden sie als Index (nach Subtraktion des niedrigsten Werts) in eine Tabelle mit Befehlszeigern verwendet - den tableswitchBefehl.

Wenn die Konstanten spärlich sind, wird eine binäre Suche nach dem richtigen Fall durchgeführt - der lookupswitchAnweisung.

Beim Entzuckern switchvon StringObjekten werden wahrscheinlich beide Anweisungen verwendet. Das lookupswitchist für den ersten Einschalt-Hash-Code geeignet, um die ursprüngliche Position des Gehäuses zu ermitteln. Die resultierende Ordnungszahl ist eine natürliche Anpassung für a tableswitch.

Beide Anweisungen erfordern, dass die jedem Fall zugewiesenen Ganzzahlkonstanten zur Kompilierungszeit sortiert werden. Während zur Laufzeit die O(1)Leistung von im tableswitchAllgemeinen besser erscheint als die O(log(n))Leistung von lookupswitch, ist eine Analyse erforderlich, um festzustellen, ob die Tabelle dicht genug ist, um den Raum-Zeit-Kompromiss zu rechtfertigen. Bill Venners hat einen großartigen Artikel geschrieben , der dies ausführlicher behandelt, zusammen mit einem Blick unter die Haube auf andere Anweisungen zur Java-Flusskontrolle.

Vor JDK 7

Vor JDK 7 enumkönnte sich ein StringSchalter annähern . Dies verwendet die statischevalueOf Methode, die vom Compiler für jeden enumTyp generiert wird . Zum Beispiel:

Pill p = Pill.valueOf(str);
switch(p) {
  case RED:  pop();  break;
  case BLUE: push(); break;
}

26
Es ist möglicherweise schneller, If-Else-If anstelle eines Hash für einen stringbasierten Switch zu verwenden. Ich habe festgestellt, dass Wörterbücher ziemlich teuer sind, wenn nur ein paar Artikel gespeichert werden.
Jonathan Allen

84
Ein if-elseif-elseif-elseif-else könnte schneller sein, aber ich würde den saubereren Code 99-mal von 100 nehmen. Da Strings unveränderlich sind, zwischenspeichern sie ihren Hash-Code, so dass das "Berechnen" des Hash schnell ist. Man müsste den Code profilieren, um festzustellen, welchen Nutzen es gibt.
Erickson

21
Der Grund für das Hinzufügen von switch (String) ist, dass es die von switch () -Anweisungen erwarteten Leistungsgarantien nicht erfüllt. Sie wollten Entwickler nicht "irreführen". Ehrlich gesagt denke ich nicht, dass sie die Leistung von switch () von Anfang an garantieren sollten.
Gili

2
Wenn Sie nur Pilleine Aktion basierend auf verwenden, strwürde ich argumentieren, ob-else vorzuziehen ist, da Sie damit strWerte außerhalb des Bereichs ROT, BLAU verarbeiten können, ohne eine Ausnahme abfangen valueOfoder manuell nach einer Übereinstimmung mit dem Namen von suchen zu müssen Jeder Aufzählungstyp, der nur unnötigen Overhead hinzufügt. Nach meiner Erfahrung hat es nur Sinn gemacht, valueOfeine Aufzählung zu verwenden, wenn später eine typsichere Darstellung des String-Werts benötigt wurde.
MilesHampson

Ich frage mich, ob Compiler sich bemühen, zu testen, ob es ein Zahlenpaar (x, y) gibt, für das die Wertemenge (hash >> x) & ((1<<y)-1)unterschiedliche Werte für jede Zeichenfolge hashCodeergibt, die unterschiedlich ist und (1<<y)weniger als die doppelte Anzahl von Zeichenfolgen (oder at) beträgt zumindest nicht viel größer als das).
Supercat

125

Wenn Sie in Ihrem Code eine Stelle haben, an der Sie einen String einschalten können, ist es möglicherweise besser, den String so umzugestalten, dass er eine Aufzählung der möglichen Werte enthält, die Sie einschalten können. Natürlich beschränken Sie die potenziellen Werte von Strings, die Sie haben können, auf diejenigen in der Aufzählung, die möglicherweise erwünscht sind oder nicht.

Natürlich könnte Ihre Aufzählung einen Eintrag für 'other' und eine fromString (String) -Methode haben, dann könnten Sie haben

ValueEnum enumval = ValueEnum.fromString(myString);
switch (enumval) {
   case MILK: lap(); break;
   case WATER: sip(); break;
   case BEER: quaff(); break;
   case OTHER: 
   default: dance(); break;
}

4
Mit dieser Technik können Sie auch über Probleme wie Groß- und Kleinschreibung, Aliase usw. entscheiden. Anstatt von einem Sprachdesigner abhängig zu sein, müssen Sie die Lösung "Einheitsgröße" entwickeln.
Darron

2
Stimmen Sie mit JeeBee überein, wenn Sie Zeichenfolgen einschalten, benötigen Sie wahrscheinlich eine Aufzählung. Die Zeichenfolge stellt normalerweise etwas dar, das an eine Schnittstelle (Benutzer oder auf andere Weise) geht, die sich in Zukunft möglicherweise ändert oder nicht. Ersetzen Sie sie daher besser durch Aufzählungen
hhafez

18
Unter xefer.com/2006/12/switchonstring finden Sie eine schöne Beschreibung dieser Methode.
David Schmitt

@ DavidSchmitt Die Beschreibung hat einen großen Fehler. Es fängt alle Ausnahmen ab, anstatt diejenigen, die tatsächlich von der Methode ausgelöst werden.
M. Mimpen

91

Das Folgende ist ein vollständiges Beispiel, das auf dem Beitrag von JeeBee basiert und Java-Enums anstelle einer benutzerdefinierten Methode verwendet.

Beachten Sie, dass Sie in Java SE 7 und höher stattdessen ein String-Objekt im Ausdruck der switch-Anweisung verwenden können.

public class Main {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {

      String current = args[0];
      Days currentDay = Days.valueOf(current.toUpperCase());

      switch (currentDay) {
          case MONDAY:
          case TUESDAY:
          case WEDNESDAY:
              System.out.println("boring");
              break;
          case THURSDAY:
              System.out.println("getting better");
          case FRIDAY:
          case SATURDAY:
          case SUNDAY:
              System.out.println("much better");
              break;

      }
  }

  public enum Days {

    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
  }
}

26

Auf Ganzzahlen basierende Schalter können auf sehr effizienten Code optimiert werden. Schalter, die auf einem anderen Datentyp basieren, können nur zu einer Reihe von if () -Anweisungen kompiliert werden.

Aus diesem Grund erlaubt C & C ++ nur das Umschalten auf ganzzahlige Typen, da dies bei anderen Typen sinnlos war.

Die Designer von C # entschieden, dass der Stil wichtig war, auch wenn es keinen Vorteil gab.

Die Designer von Java dachten anscheinend wie die Designer von C.


26
Switches, die auf einem beliebigen Hash-Objekt basieren, können mithilfe einer Hash-Tabelle sehr effizient implementiert werden - siehe .NET. Ihr Grund ist also nicht ganz richtig.
Konrad Rudolph

Ja, und das verstehe ich nicht. Haben sie Angst, dass Hashing-Objekte auf lange Sicht zu teuer werden?
Alex Beardsley

3
@Nalandial: Eigentlich ist es mit ein wenig Aufwand seitens des Compilers überhaupt nicht teuer, denn wenn der Satz von Strings bekannt ist, ist es ziemlich einfach, einen perfekten Hash zu generieren (dies wird jedoch nicht von .NET durchgeführt; wahrscheinlich auch nicht die Mühe wert).
Konrad Rudolph

3
@Nalandial & @Konrad Rudolph - Während das Hashing eines Strings (aufgrund seiner unveränderlichen Natur) als Lösung für dieses Problem erscheint, müssen Sie bedenken, dass alle nicht endgültigen Objekte ihre Hashing-Funktionen überschreiben können. Dies macht es zur Kompilierungszeit schwierig, die Konsistenz in einem Switch sicherzustellen.
Martinatime

2
Sie können auch einen DFA erstellen, der mit der Zeichenfolge übereinstimmt (wie dies bei Engines für reguläre Ausdrücke der Fall ist). Möglicherweise sogar effizienter als Hashing.
Nate CK

19

Ein Beispiel für die direkte StringVerwendung seit 1.7 kann ebenfalls gezeigt werden:

public static void main(String[] args) {

    switch (args[0]) {
        case "Monday":
        case "Tuesday":
        case "Wednesday":
            System.out.println("boring");
            break;
        case "Thursday":
            System.out.println("getting better");
        case "Friday":
        case "Saturday":
        case "Sunday":
            System.out.println("much better");
            break;
    }

}

18

James Curran sagt kurz und bündig: "Schalter, die auf Ganzzahlen basieren, können auf sehr effizienten Code optimiert werden. Schalter, die auf einem anderen Datentyp basieren, können nur zu einer Reihe von if () -Anweisungen kompiliert werden. Aus diesem Grund erlauben C & C ++ nur Umschaltungen auf Ganzzahltypen. da war es bei anderen Typen sinnlos. "

Meine Meinung, und es ist nur die, ist, dass Sie, sobald Sie anfangen, Nicht-Primitive einzuschalten, anfangen müssen, über "gleich" gegen "==" nachzudenken. Erstens kann das Vergleichen von zwei Zeichenfolgen ein ziemlich langwieriger Vorgang sein, der zu den oben genannten Leistungsproblemen beiträgt. Zweitens, wenn es das Einschalten von Strings gibt, wird es erforderlich sein, Strings einzuschalten, Groß- und Kleinschreibung zu ignorieren, Strings einzuschalten, die das Gebietsschema berücksichtigen / ignorieren, Strings basierend auf Regex einzuschalten ... Ich würde eine Entscheidung gutheißen, die viel Zeit für die Sprachentwickler auf Kosten einer kleinen Zeitspanne für Programmierer.


Technisch gesehen "wechseln" Regexe bereits, da es sich im Grunde nur um Zustandsmaschinen handelt. sie haben nur zwei "Fälle", matchedund not matched. (Ohne Berücksichtigung von Dingen wie [benannten] Gruppen / etc.)
JAB

1
docs.oracle.com/javase/7/docs/technotes/guides/language/… besagt: Der Java-Compiler generiert im Allgemeinen effizienteren Bytecode aus switch-Anweisungen, die String-Objekte verwenden, als aus verketteten if-then-else-Anweisungen.
Wim Deblauwe

12

Neben den oben genannten guten Argumenten möchte ich hinzufügen, dass viele Leute heute switcheinen veralteten Rest der prozeduralen Vergangenheit von Java sehen (zurück zur C-Zeit).

Ich teile diese Meinung nicht vollständig, ich denke, sie switchkann in einigen Fällen nützlich sein, zumindest aufgrund ihrer Geschwindigkeit, und trotzdem ist sie besser als eine Reihe von kaskadierenden Zahlen, die else ifich in einem Code gesehen habe ...

In der Tat lohnt es sich jedoch, den Fall zu betrachten, in dem Sie einen Schalter benötigen, und zu prüfen, ob dieser nicht durch etwas OO ersetzt werden kann. Zum Beispiel Enums in Java 1.5+, vielleicht HashTable oder eine andere Sammlung (manchmal bedauere ich, dass wir keine (anonymen) Funktionen als erstklassiger Bürger haben, wie in Lua - das keinen Schalter hat - oder JavaScript) oder sogar Polymorphismus.


"Manchmal bedauere ich, dass wir keine (anonymen) Funktionen als erstklassiger Bürger haben." Das stimmt nicht mehr.
user8397947

@dorukayhan Ja natürlich. Aber möchten Sie bei allen Antworten der letzten zehn Jahre einen Kommentar hinzufügen, um der Welt mitzuteilen, dass wir sie haben können, wenn wir auf neuere Versionen von Java aktualisieren? :-D
PhiLho

8

Wenn Sie JDK7 oder höher nicht verwenden, können Sie hashCode()es simulieren. Da String.hashCode()normalerweise unterschiedliche Werte für unterschiedliche Zeichenfolgen und immer gleiche Werte für gleiche Zeichenfolgen zurückgegeben werden, ist dies ziemlich zuverlässig (unterschiedliche Zeichenfolgen können denselben Hashcode wie @Lii erzeugen, der in einem Kommentar erwähnt wird, z. B. "FB"und "Ea"). Siehe Dokumentation .

Der Code würde also so aussehen:

String s = "<Your String>";

switch(s.hashCode()) {
case "Hello".hashCode(): break;
case "Goodbye".hashCode(): break;
}

Auf diese Weise schalten Sie technisch ein int.

Alternativ können Sie den folgenden Code verwenden:

public final class Switch<T> {
    private final HashMap<T, Runnable> cases = new HashMap<T, Runnable>(0);

    public void addCase(T object, Runnable action) {
        this.cases.put(object, action);
    }

    public void SWITCH(T object) {
        for (T t : this.cases.keySet()) {
            if (object.equals(t)) { // This means that the class works with any object!
                this.cases.get(t).run();
                break;
            }
        }
    }
}

5
Zwei verschiedene Zeichenfolgen können denselben Hashcode haben. Wenn Sie also Hashcodes aktivieren, wird möglicherweise die falsche Groß- / Kleinschreibung verwendet.
Lii

@Lii Danke für den Hinweis! Es ist zwar unwahrscheinlich, aber ich würde nicht darauf vertrauen, dass es funktioniert. "FB" und "Ea" haben den gleichen Hashcode, so dass es nicht unmöglich ist, eine Kollision zu finden. Der zweite Code ist wahrscheinlich zuverlässiger.
HyperNeutrino

Ich bin überrascht, dass dies kompiliert wird, da caseAussagen, wie ich dachte, immer konstante Werte sein mussten und dies String.hashCode()nicht sind (auch wenn sich die Berechnung zwischen JVMs in der Praxis nie geändert hat).
StaxMan

@StaxMan Hm interessant, ich habe nie aufgehört, das zu beobachten. Aber ja, caseAnweisungswerte müssen zur Kompilierungszeit nicht bestimmbar sein, damit sie einwandfrei funktionieren.
HyperNeutrino

4

Seit Jahren verwenden wir dafür einen (n Open Source) Präprozessor.

//#switch(target)
case "foo": code;
//#end

Vorverarbeitete Dateien heißen Foo.jpp und werden mit einem Ant-Skript in Foo.java verarbeitet.

Vorteil ist, dass es in Java verarbeitet wird, das unter 1.0 ausgeführt wird (obwohl wir normalerweise nur bis 1.4 unterstützt haben). Außerdem war es viel einfacher, dies zu tun (viele String-Schalter), als es mit Aufzählungen oder anderen Problemumgehungen zu fummeln - Code war viel einfacher zu lesen, zu warten und zu verstehen. IIRC (kann derzeit keine Statistiken oder technischen Argumente liefern) war auch schneller als die natürlichen Java-Äquivalente.

Nachteile sind, dass Sie Java nicht bearbeiten, so dass es ein bisschen mehr Workflow ist (Bearbeiten, Verarbeiten, Kompilieren / Testen) und eine IDE eine Verbindung zu Java herstellt, die ein wenig kompliziert ist (der Schalter wird zu einer Reihe von if / else-Logikschritten). und die Schaltergehäusereihenfolge wird nicht beibehalten.

Ich würde es nicht für 1.7+ empfehlen, aber es ist nützlich, wenn Sie Java programmieren möchten, das auf frühere JVMs abzielt (da Joe public selten die neueste Version installiert hat).

Sie können es von SVN erhalten oder den Code online durchsuchen . Sie benötigen EBuild , um es so zu erstellen, wie es ist.


6
Sie benötigen die JVM 1.7 nicht, um Code mit einem String-Schalter auszuführen. Der 1.7-Compiler verwandelt den String-Schalter in etwas, das zuvor vorhandenen Bytecode verwendet.
Dawood ibn Kareem

4

Andere Antworten besagten, dass dies in Java 7 hinzugefügt wurde und Problemumgehungen für frühere Versionen gegeben wurden. Diese Antwort versucht das "Warum" zu beantworten.

Java war eine Reaktion auf die Überkomplexität von C ++. Es wurde entworfen, um eine einfache saubere Sprache zu sein.

String hat ein wenig Sonderfallbehandlung in der Sprache, aber es scheint mir klar zu sein, dass die Designer versucht haben, die Menge an Spezialhülle und syntaktischem Zucker auf ein Minimum zu beschränken.

Das Einschalten von Strings ist unter der Haube ziemlich komplex, da Strings keine einfachen primitiven Typen sind. Es war zu der Zeit, als Java entworfen wurde, keine übliche Funktion und passt nicht wirklich gut zum minimalistischen Design. Zumal sie beschlossen hatten, keinen Sonderfall == für Zeichenfolgen zu verwenden, wäre (und ist) es ein bisschen seltsam, wenn der Fall dort funktioniert, wo == nicht funktioniert.

Zwischen 1.0 und 1.4 blieb die Sprache selbst ziemlich gleich. Die meisten Verbesserungen an Java waren auf der Bibliotheksseite.

Daß sich mit Java 5 alles geändert hat, wurde die Sprache erheblich erweitert. Weitere Erweiterungen folgten in den Versionen 7 und 8. Ich gehe davon aus, dass diese Änderung der Einstellung durch den Anstieg von C # verursacht wurde


Die Erzählung über switch (String) passt zum Verlauf, zur Zeitachse und zum Kontext cpp / cs.
Espresso

Es war ein großer Fehler, diese Funktion nicht zu implementieren. Alles andere ist eine billige Ausrede. Java hat im Laufe der Jahre viele Benutzer verloren, weil es an Fortschritten mangelte und die Designer hartnäckig waren, die Sprache nicht weiterzuentwickeln. Glücklicherweise haben sie nach JDK7
Firephil

0

JEP 354: Switch-Ausdrücke (Vorschau) in JDK-13 und JEP 361: Switch-Ausdrücke (Standard) in JDK-14 erweitern die switch-Anweisung, sodass sie als Ausdruck verwendet werden kann .

Jetzt kannst du:

  • Variable direkt aus Schalterausdruck zuweisen ,
  • Verwenden Sie eine neue Form der Schalterbezeichnung ( case L ->):

    Der Code rechts von der Schalterbezeichnung "case L ->" ist auf einen Ausdruck, einen Block oder (der Einfachheit halber) eine throw-Anweisung beschränkt.

  • Verwenden Sie mehrere durch Kommas getrennte Konstanten pro Fall.
  • und es gibt auch keine wertebrüche mehr :

    Um einen Wert aus einem switch-Ausdruck zu erhalten, wird die breakwith-value-Anweisung zugunsten einer yieldAnweisung gelöscht .

Die Demo aus den Antworten ( 1 , 2 ) könnte also so aussehen:

  public static void main(String[] args) {
    switch (args[0]) {
      case "Monday", "Tuesday", "Wednesday" ->  System.out.println("boring");
      case "Thursday" -> System.out.println("getting better");
      case "Friday", "Saturday", "Sunday" -> System.out.println("much better");
    }

-2

Nicht sehr hübsch, aber hier ist ein anderer Weg für Java 6 und unten:

String runFct = 
        queryType.equals("eq") ? "method1":
        queryType.equals("L_L")? "method2":
        queryType.equals("L_R")? "method3":
        queryType.equals("L_LR")? "method4":
            "method5";
Method m = this.getClass().getMethod(runFct);
m.invoke(this);

-3

Es ist ein Kinderspiel in Groovy; Ich binde das groovige Glas ein und erstelle eine groovyUtility-Klasse, um all diese und weitere Dinge zu erledigen, die ich in Java als ärgerlich empfinde (da ich im Unternehmen nicht mehr mit Java 6 arbeiten kann).

it.'p'.each{
switch (it.@name.text()){
   case "choclate":
     myholder.myval=(it.text());
     break;
     }}...

9
@SSpoke Da dies eine Java-Frage ist und eine Groovy-Antwort nicht zum Thema gehört und ein nutzloser Plug ist.
Martin

12
Auch in konservativen großen SW-Häusern wird Groovy zusammen mit Java eingesetzt. JVM bietet eine sprachunabhängige Umgebung mehr als eine Sprache, um das relevanteste Programmierparadigma für die Lösung zu mischen und zu verwenden. Vielleicht sollte ich jetzt einen Ausschnitt in Clojure hinzufügen, um weitere Abstimmungen zu sammeln :) ...
Alex Punnen

1
Wie funktioniert die Syntax? Ich vermute, Groovy ist eine andere Programmiersprache ...? Es tut uns leid. Ich weiß nichts über Groovy.
HyperNeutrino

-4

Wenn Sie Intellij verwenden, sehen Sie sich auch Folgendes an:

Datei -> Projektstruktur -> Projekt

Datei -> Projektstruktur -> Module

Wenn Sie mehrere Module haben, stellen Sie sicher, dass Sie auf der Registerkarte "Modul" das richtige Sprachniveau festlegen.


1
Ich bin mir nicht sicher, wie Ihre Antwort für die Frage relevant ist. Er fragte, warum eine String-Switch-Anweisung wie die folgende nicht verfügbar sei: String mystring = "etwas"; switch (mystring) {case "etwas" sysout ("got here"); . . }
Deepak Agarwal

-8
public class StringSwitchCase { 

    public static void main(String args[]) {

        visitIsland("Santorini"); 
        visitIsland("Crete"); 
        visitIsland("Paros"); 

    } 

    public static void visitIsland(String island) {
         switch(island) {
          case "Corfu": 
               System.out.println("User wants to visit Corfu");
               break; 
          case "Crete": 
               System.out.println("User wants to visit Crete");
               break; 
          case "Santorini": 
               System.out.println("User wants to visit Santorini");
               break; 
          case "Mykonos": 
               System.out.println("User wants to visit Mykonos");
               break; 
         default: 
               System.out.println("Unknown Island");
               break; 
         } 
    } 

} 

8
Das OP fragt nicht, wie eine Zeichenfolge eingeschaltet werden soll. Er / Sie fragt, warum er / sie dies aufgrund von Syntaxbeschränkungen vor JDK7 nicht kann.
HyperNeutrino
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.