how - java isempty null
¿Por qué no hay String.Empty en Java? (10)
Apache StringUtils aborda este problema también.
Fallos de las demás opciones:
- isEmpty () - no es nulo seguro. Si la cadena es nula, lanza un NPE.
- length () == 0 - de nuevo no es nulo seguro. Tampoco se tienen en cuenta las cadenas de espacios en blanco.
- Comparación con la constante VACÍO: no puede ser nulo seguro. Problema del espacio en blanco
Concedido StringUtils es otra biblioteca para arrastrar, pero funciona muy bien y ahorra un montón de tiempo y comprobación de problemas para los nulos o el manejo elegante de los NPE.
Entiendo que cada vez que escribo el literal de cadena ""
, se hace referencia al mismo objeto de cadena en el conjunto de cadenas.
Pero, ¿por qué la API de cadena no incluye una public static final String Empty = "";
, entonces podría usar referencias a String.Empty
?
Se ahorraría en tiempo de compilación, al menos, ya que el compilador sabría hacer referencia a la cadena existente, y no tendría que verificar si ya se había creado para su reutilización, ¿verdad? Y personalmente creo que una proliferación de literales de cuerdas, especialmente los pequeños, en muchos casos es un "olor a código".
Entonces, ¿hubo una Gran razón de diseño detrás de String.Empty o los creadores de lenguaje simplemente no compartieron mis puntos de vista?
No se limite a decir "el grupo de memoria de cadenas se reutiliza en forma literal, caso cerrado". Lo que hacen los compiladores bajo el capó no es el punto aquí. La pregunta es razonable, especialmente dado el número de votos ascendentes recibidos.
Se trata de la simetría , sin ella las API son más difíciles de usar para los humanos. Los primeros SDK de Java ignoraron notoriamente la regla y ahora es un poco tarde. Aquí hay algunos ejemplos sobre mi cabeza, siéntase libre de agregar su ejemplo "favorito":
- BigDecimal.ZERO, pero no AbstractCollection.EMPTY, String.EMPTY
- Array.length pero List.size ()
- List.add (), Set.add () pero Map.put (), ByteBuffer.put () y no olvidemos StringBuilder.append (), Stack.push ()
Para agregar a lo que Noel M dijo, puedes mirar esta pregunta, y esta respuesta muestra que la constante se reutiliza.
http://forums.java.net/jive/message.jspa?messageID=17122
La constante de cadena siempre está "internada", por lo que realmente no hay necesidad de tal constante.
String s=""; String t=""; boolean b=s==t; // true
Para los que dicen ""
y String.Empty
son intercambiables o que ""
es mejor, está muy equivocado.
Cada vez que haces algo como myVariable = ""; estás creando una instancia de un objeto. Si el objeto String de Java tuviera una constante pública VACÍA, solo habría 1 instancia del objeto ""
P.ej: -
String.EMPTY = ""; //Simply demonstrating. I realize this is invalid syntax
myVar0 = String.EMPTY;
myVar1 = String.EMPTY;
myVar2 = String.EMPTY;
myVar3 = String.EMPTY;
myVar4 = String.EMPTY;
myVar5 = String.EMPTY;
myVar6 = String.EMPTY;
myVar7 = String.EMPTY;
myVar8 = String.EMPTY;
myVar9 = String.EMPTY;
10 (11 incluyendo String.EMPTY) Punteros a 1 objeto
O: -
myVar0 = "";
myVar1 = "";
myVar2 = "";
myVar3 = "";
myVar4 = "";
myVar5 = "";
myVar6 = "";
myVar7 = "";
myVar8 = "";
myVar9 = "";
10 punteros a 10 objetos
Esto es ineficiente y en una gran aplicación, puede ser significativo.
Quizás el compilador de Java o el tiempo de ejecución sea lo suficientemente eficiente como para apuntar automáticamente todas las instancias de "" a la misma instancia, pero podría no hacerlo y requiere un procesamiento adicional para tomar esa determinación.
Si desea comparar con una cadena vacía sin preocuparse por los valores nulos, puede hacer lo siguiente.
if ("".equals(text))
En última instancia, debes hacer lo que crees que es más claro. La mayoría de los programadores suponen que "" significa cadena vacía, no una cadena en la que alguien se olvidó de poner algo.
Si crees que hay una ventaja de rendimiento, deberías probarlo. Si no crees que valga la pena probarlo por ti mismo, es una buena indicación de que realmente no vale la pena.
Parece que tratas de resolver un problema que se resolvió cuando el lenguaje se diseñó hace más de 15 años.
Si realmente desea una constante String.EMPTY, puede crear una clase final estática de utilidad llamada "Constantes" (por ejemplo) en su proyecto. Esta clase mantendrá tus constantes, incluyendo la Cadena vacía ...
En la misma idea, puedes crear CERO, UNA constantes int ... que no existen en la clase Integer, pero como he comentado, sería un dolor escribir y leer:
for(int i=Constants.ZERO; ...) {
if(myArray.length > Constants.ONE) {
System.out.println("More than one element");
}
}
Etc.
Todos esos ""
literales son el mismo objeto. ¿Por qué hacer toda esa complejidad extra? Es solo más largo para escribir y menos claro (el costo para el compilador es mínimo). Dado que las cadenas de Java son objetos inmutables, nunca hay ninguna necesidad de distinguir entre ellas, excepto posiblemente como una cuestión de eficiencia, pero con el literal de la cadena vacía no es una gran cosa.
Si realmente quieres una constante EmptyString
, EmptyString
tú mismo. Pero todo lo que hará es alentar un código aún más detallado; Nunca habrá ningún beneficio al hacerlo.
org.apache.commons.lang.StringUtils.EMPTY
String.EMPTY
tiene 12 caracteres y ""
es dos, y ambos estarían haciendo referencia exactamente a la misma instancia en la memoria en tiempo de ejecución. No estoy completamente seguro de por qué String.EMPTY
ahorraría tiempo de compilación, de hecho creo que sería lo último.
Especialmente considerando que los String
s son inmutables, no es como si primero pudieras obtener un String vacío, y realizar algunas operaciones en él, lo mejor es usar un StringBuilder
(o StringBuffer
si quieres estar seguro), y convertirlo en un String.
Actualizar
De tu comentario a la pregunta:
Lo que inspiró esto es en realidad
TextBox.setText("");
Creo que sería totalmente legítimo proporcionar una constante en su clase apropiada:
private static final String EMPTY_STRING = "";
Y luego haz referencia como en tu código como
TextBox.setText(EMPTY_STRING);
De esta manera, al menos, está explícito que desea una Cadena vacía, en lugar de olvidarse de completar la Cadena en su IDE o algo similar.
Entiendo que cada vez que escribo el literal de String "", se hace referencia al mismo objeto de String en el conjunto de String.
No hay tal garantía hecha. Y no puede confiar en ello en su aplicación, es completamente decisión de JVM.
¿O los creadores del lenguaje simplemente no compartieron mis puntos de vista?
Sí. A mi me parece cosa de muy baja prioridad.