Pisząc testy jednostkowe dla funkcji zwracającej, boolean
która zajmuje dwa String
s, musiałem przetestować każdy znak alfabetu ( 'a'
-'z'
) w sekwencji jako jeden z parametrów, jeden po drugim, więc napisałem to, aby to zrobić:
for(char c = 'a'; c <= 'z'; c++)
{
assertTrue(MyClass.MyFunction(testSubject, new String(c));
}
Myślałbym, że to jest dopuszczalne, ale tak nie było, więc po prostu zrobiłem to w ten sposób:
for(char c = 'a'; c <= 'z'; c++)
{
assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
}
Czy jest to niezawodna metoda konwersji char
na String
język Java? Czy to preferowany sposób? Nie znam się dużo na Javie, dlatego chciałbym coś wyjaśnić.
IntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
IntStream.rangeClosed('a', 'z')
?String
konstruktora, który nie istnieje? Popraw mnie, jeśli się mylę, ale o ile mi wiadomo, w klasie nie ma konstruktora,String
który bierze jedenchar
argument. Pamiętaj, żechar
to nie to samo cochar[]
.Odpowiedzi:
Najkrótsze rozwiązanie:
Najczystsze (i prawdopodobnie najbardziej wydajne 1 ) rozwiązania:
W porównaniu z twoim podejściem powyższe zapobiega nakładaniu się konieczności umieszczania prymitywnego
Character
obiektu w obiekcie.1 Niewielka nieefektywność konkatenacji łańcuchów w pierwszym podejściu może zostać zoptymalizowana przez kompilator lub środowisko wykonawcze, więc jeden (jeśli byłby tak skłonny) naprawdę musiałby uruchomić mikroprocesor, aby określić rzeczywistą wydajność. Takie mikrooptymalizacje rzadko są warte wysiłku, a poleganie na konkatenacji w celu wymuszenia konwersji łańcucha po prostu nie wygląda zbyt ładnie.
źródło
javac
kompilator firmy Sun automatycznie przekształcaString s = "" + c;
sięString s = String.valueOf(c);
, więc wydajność będzie taka sama.