Czy to poprawny sposób konwersji znaku na ciąg znaków w Javie? [duplikować]

20

Pisząc testy jednostkowe dla funkcji zwracającej, booleanktóra zajmuje dwa Strings, 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 charna Stringjęzyk Java? Czy to preferowany sposób? Nie znam się dużo na Javie, dlatego chciałbym coś wyjaśnić.

Govind Parmar
źródło
2
Nie bezpośrednio na twoje pytanie, ale chciałbymIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Elliott Frisch
3
@ElliottFrisch, ale dlaczego? Strumienie są tutaj niepotrzebne, ale nawet jeśli nalegasz na użycie strumieni dla każdej pętli, dlaczego przynajmniej nie użyć IntStream.rangeClosed('a', 'z')?
PhilipRoman
1
Nie ma jednego „poprawnego” sposobu. Prawdopodobnie jest to co najmniej pięć sposobów: wybór zależy zarówno od mody, jak i od faktów naukowych. Przez większość czasu to po prostu nie ma znaczenia, a program testowy jest z pewnością jednym z takich przypadków.
user207421
@PhilipRoman Ponieważ tam jest (Edmund Hillary). Bo mogę. Ponieważ chcemy (Billie Piper, tak myślę). To też fajne podejście.
Elliott Frisch
Myślałbym, że to jest dopuszczalne. Myślałeś, że można przywołać Stringkonstruktora, który nie istnieje? Popraw mnie, jeśli się mylę, ale o ile mi wiadomo, w klasie nie ma konstruktora, Stringktóry bierze jeden charargument. Pamiętaj, że charto nie to samo co char[].
Abra

Odpowiedzi:

33

Najkrótsze rozwiązanie:

char c = 'a';
String s = "" + c;

Najczystsze (i prawdopodobnie najbardziej wydajne 1 ) rozwiązania:

char c = 'a';

String s1 = String.valueOf(c);
// or
String s2 = Character.toString(c);

W porównaniu z twoim podejściem powyższe zapobiega nakładaniu się konieczności umieszczania prymitywnego Characterobiektu 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.

Robby Cornelissen
źródło
6
Ostatnim razem, gdy patrzyłem, javackompilator firmy Sun automatycznie przekształca String s = "" + c;się String s = String.valueOf(c);, więc wydajność będzie taka sama.
Neil
4
@Neil Whew! Zaczynałem myśleć, że osoba, dla której napisałem ten przypis, już nie istnieje w Stack Overflow :)
Robby Cornelissen