¿Es esta la forma correcta de convertir un char en una cadena en Java? [duplicar]

20

Mientras escribía las pruebas unitarias para una función booleanque regresa que toma dos Strings, y necesitaba probar cada carácter del alfabeto ( 'a'- 'z') en secuencia como uno de los parámetros, uno por uno, así que escribí esto para hacer eso:

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

Pensé que esto era permisible, pero no lo era, así que lo hice así:

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

¿Es este un método confiable para convertir chara a Stringen Java? ¿Es la forma preferida? No sé mucho acerca de Java, por lo que me gustaría una aclaración al respecto.

Govind Parmar
fuente
2
No directamente a su pregunta, pero lo haríaIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Elliott Frisch
3
@ElliottFrisch pero ¿por qué? Las transmisiones son innecesarias aquí, pero incluso si insiste en usar transmisiones para cada ciclo, ¿por qué no utilizarlas al menos IntStream.rangeClosed('a', 'z')?
PhilipRoman
1
No existe una única forma "correcta". Probablemente hay al menos cinco formas de hacer esto: lo que elijas depende tanto de la moda como del hecho científico. La mayoría de las veces simplemente no importa, y un programa de prueba es sin duda uno de esos casos.
user207421
@PhilipRoman Porque está allí (Edmund Hillary). Porque puedo. Porque queremos (Billie Piper, creo). Ese es un enfoque genial también.
Elliott Frisch
Hubiera pensado que esto era permisible. ¿Pensaste que era permisible invocar un Stringconstructor que no existe? Corrígeme si me equivoco, pero que yo sepa, no hay un constructor en clase Stringque tome un solo charargumento. Tenga en cuenta que charno es lo mismo que char[].
Abra hace

Respuestas:

33

La solución más corta:

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

Las soluciones más limpias (y probablemente las más eficientes 1 ):

char c = 'a';

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

En comparación con su enfoque, lo anterior evita la sobrecarga de tener que encajonar lo primitivo en un Characterobjeto.


1 El compilador o el tiempo de ejecución podrían optimizar la leve ineficiencia de la concatenación de cadenas en el primer enfoque, por lo que uno (si uno estuviera tan inclinado) realmente tendría que ejecutar un micro-punto de referencia para determinar el rendimiento real. Las micro optimizaciones como esta rara vez valen la pena, y confiar en la concatenación para forzar la conversión de cadenas simplemente no se ve muy bien.

Robby Cornelissen
fuente
66
La última vez que miré, de Sun javaccompilador transforma automáticamente String s = "" + c;en String s = String.valueOf(c);, por lo que el rendimiento sería el mismo.
Neil
44
@Neil Whew! Estaba empezando a pensar que el tipo de persona para quien escribí esa nota al pie ya no existía en Stack Overflow :)
Robby Cornelissen