È questo il modo corretto per convertire un carattere in una stringa in Java? [duplicare]


20

Durante la scrittura di unit test per una funzione booleanche ritorna che richiede due Strings, e ho dovuto testare ogni carattere dell'alfabeto ( 'a'- 'z') in sequenza come uno dei parametri, uno per uno, quindi ho scritto questo per farlo:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, new String(c));
} 

Avrei pensato che fosse ammissibile, ma non lo era, quindi invece l'ho fatto così:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
} 

È un metodo affidabile per convertire a charin Stringin Java? È il modo preferito? Non so molto su Java, quindi vorrei qualche chiarimento al riguardo.


2
Non direttamente alla tua domanda, ma lo fareiIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Elliott Frisch il

3
@ElliottFrisch ma perché? Gli stream qui non sono necessari, ma anche se insisti nell'usare stream per ogni loop, perché non utilizzarli almeno IntStream.rangeClosed('a', 'z')?
PhilipRoman,

1
Non esiste un solo modo "corretto". Probabilmente ci sono almeno cinque modi per farlo: quello che scegli dipende dalla moda tanto quanto dai fatti scientifici. Il più delle volte non importa, e un programma di test è sicuramente uno di questi casi.
user207421

@PhilipRoman Perché è lì (Edmund Hillary). Perché io posso. Perché vogliamo (Billie Piper, penso). Anche questo è un approccio interessante.
Elliott Frisch,

Avrei pensato che fosse lecito. Pensavi fosse lecito invocare un Stringcostruttore che non esiste? Correggimi se sbaglio, ma per quanto ne so, non esiste un costruttore in classe Stringche prenda un singolo charargomento. Nota che charnon è lo stesso di char[].
Abra

Risposte:


33

La soluzione più breve:

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

Le soluzioni più pulite (e probabilmente più efficienti 1 ):

char c = 'a';

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

Rispetto al tuo approccio, quanto sopra evita il sovraccarico di dover inscatolare la primitiva in un Characteroggetto.


1 La leggera inefficienza della concatenazione di stringhe nel primo approccio potrebbe essere ottimizzata dal compilatore o dal runtime, quindi uno (se uno fosse così incline) dovrebbe davvero eseguire un micro-benchmark per determinare le prestazioni effettive. Le micro-ottimizzazioni come questa raramente valgono la pena, e basarsi sulla concatenazione per forzare la conversione delle stringhe non sembra molto bello.


6
L'ultima volta che ho guardato, il javaccompilatore di Sun si trasforma automaticamente String s = "" + c;in String s = String.valueOf(c);, quindi le prestazioni sarebbero le stesse.
Neil,

4
@Neil Whew! Stavo iniziando a pensare che il tipo di persona per cui ho scritto quella nota a piè di pagina non esistesse più su Stack Overflow :)
Robby Cornelissen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.