El texto citado es:
"Sin embargo, confiar en esos valores predeterminados generalmente se considera un mal estilo de programación".
Cínicamente: "generalmente se considera que" es a menudo una forma de decir que el autor no ha tratado de encontrar una fuente autorizada para la declaración que se presenta.
En este caso, la afirmación es claramente cuestionable. Evidencia: 5 de las 5 Guías de estilo Java muestreadas NO dicen nada sobre si debería o debería confiar en los valores predeterminados:
(Tenga en cuenta que mi metodología para el muestreo fue mirar los primeros 5 resultados distintos de búsqueda de Google para "guía de estilo java". Luego busqué en cada documento el "valor predeterminado". Este no es un análisis exhaustivo, pero sirve para aclarar mi punto. )
OKAY. Entonces, ¿realmente ayuda a la legibilidad del código Java?
Esto es discutible.
Por un lado, un programador Java novato que no ha aprendido sobre la inicialización predeterminada puede estar desconcertado acerca de dónde provienen los ceros o los valores nulos. Pero si se molestan en buscar una inicialización explícita y encuentran que no hay una, eso debería ser suficiente para hacer que lean un tutorial o libro para averiguar sobre la inicialización predeterminada. (¡Lo esperarías!)
Por otro lado, normalmente no esperamos que los programadores Java novatos mantengan bases de código de producción. Para un programador Java experimentado, una inicialización redundante no mejora la legibilidad. Es (en el mejor de los casos) ruido.
En mi opinión, lo único que se logra mediante una inicialización redundante de un campo es indicar a un futuro lector de su código que ha pensado en el valor inicial. (Como lo expresó @GhostCat, la inicialización predeterminada no comunica la intención).
Pero, por el contrario, si fuera ese lector, no necesariamente confiaría en el pensamiento del autor del código. Entonces el valor de esta "señal" también es cuestionable.
¿Qué pasa con la fiabilidad?
En Java no hay diferencia. El JLS especifica que la inicialización por defecto no ocurre para los campos. Y a la inversa, para las variables locales es un error de compilación intentar usar una variable que no se ha inicializado definitivamente.
En resumen, el comportamiento en tiempo de ejecución de una variable que no se inicializa explícitamente es completamente predecible.
Por el contrario, en lenguajes como C o C ++, donde las variables pueden no inicializarse, el comportamiento no se especifica y puede provocar bloqueos y diferencias de comportamiento en diferentes plataformas. El caso de siempre inicializar explícitamente las variables es mucho más fuerte aquí.
¿Qué pasa con el rendimiento?
No debería hacer ninguna diferencia. El compilador JIT debería poder tratar una inicialización redundante y una inicialización predeterminada de la misma manera.
private int count = 0;
es un código que no hace nada, y el código que no hace nada es desorden. Es como importar clases de java.lang, o declarar una clase conextends Object
.