Beim Schreiben von Komponententests für eine Funktion boolean
, die zwei String
Sekunden zurückgibt, musste ich jedes Zeichen des Alphabets ( 'a'
- 'z'
) nacheinander als einen der Parameter einzeln testen. Dazu habe ich Folgendes geschrieben:
for(char c = 'a'; c <= 'z'; c++)
{
assertTrue(MyClass.MyFunction(testSubject, new String(c));
}
Ich hätte gedacht, dass dies zulässig ist, aber es war nicht so, also habe ich es stattdessen einfach so gemacht:
for(char c = 'a'; c <= 'z'; c++)
{
assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
}
Ist dies eine zuverlässige Methode, um char
a String
in Java in a zu konvertieren ? Ist es der bevorzugte Weg? Ich weiß nicht viel über Java und möchte daher einige Erläuterungen dazu.
IntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
IntStream.rangeClosed('a', 'z')
?String
Konstruktor aufzurufen , der nicht existiert? Korrigieren Sie mich, wenn ich falsch liege, aber soweit mir bekannt ist, gibt es in der Klasse keinen KonstruktorString
, der ein einzigeschar
Argument akzeptiert. Beachten Sie, dass dieschar
nicht dasselbe ist wiechar[]
.Antworten:
Die kürzeste Lösung:
Die saubersten (und wahrscheinlich effizientesten 1 ) Lösungen:
Im Vergleich zu Ihrem Ansatz verhindert das oben Gesagte, dass das Grundelement in ein
Character
Objekt gepackt werden muss.1 Die leichte Ineffizienz der Zeichenfolgenverkettung im ersten Ansatz kann durch den Compiler oder die Laufzeit optimiert werden, sodass einer (wenn er so geneigt wäre) tatsächlich einen Mikro-Benchmark ausführen müsste, um die tatsächliche Leistung zu bestimmen. Mikrooptimierungen wie diese sind selten die Mühe wert, und das Verlassen auf Verkettung, um die Konvertierung von Zeichenfolgen zu erzwingen, sieht einfach nicht besonders gut aus.
quelle
javac
verwandelt sich der Compiler von Sun automatischString s = "" + c;
inString s = String.valueOf(c);
, sodass die Leistung gleich ist.