java static private public final

scrollbar java



¿''Final estática pública'' o ''Final estática privada'' con captador? (7)

En Java, se enseña que las variables deben mantenerse privadas para permitir una mejor encapsulación, pero ¿qué pasa con las constantes estáticas? Esta:

public static final int FOO = 5;

Sería equivalente en resultado a esto:

private static final int FOO = 5; ... public static getFoo() { return FOO; }

¿Pero cuál es la mejor práctica?


Dado que una variable final no se puede cambiar más adelante si la va a usar como una constante global, hágala pública y no la necesita.


El primero si el resultado de getFoo es costoso y no necesita ser evaluado en tiempo de ejecución.


Getter no tiene sentido aquí y lo más probable es que esté en línea por la JVM. Sólo quédate con la constante pública.

La idea detrás de la encapsulación es proteger los cambios no deseados de una variable y ocultar la representación interna. Con las constantes no tiene mucho sentido.


Hay una razón para no usar una constante directamente en su código.

Supongamos que FOO puede cambiar más adelante (pero se mantiene constante), digamos a public static final int FOO = 10; . No debería romper nada mientras que nadie sea lo suficientemente estúpido como para codificar el valor directamente, ¿verdad?

No. El compilador de Java incluirá constantes en línea como Foo arriba en el código de llamada, es decir, someFunc(FooClass.FOO); se convierte en someFunc(5); . Ahora, si recompila su biblioteca pero no el código de llamada, puede terminar en situaciones sorprendentes. Esto se evita si utiliza una función: el JIT seguirá optimizándolo, por lo que no se logrará ningún rendimiento real allí.


La ventaja de usar setter y getter on member es poder sobrescribir. Esto no es válido para "métodos" estáticos (en lugar de funciones)

Tampoco hay forma de definir interfaces estáticas.

Iría con el campo de acceso.


Me quedaría con el getFoo () ya que le permite cambiar la implementación en el futuro sin cambiar el código del cliente. Como señaló @Tomasz, la JVM probablemente alineará su implementación actual, por lo que pagará una gran cantidad de penalización de rendimiento.


Usa los variales fuera de la clase como:

public def FOO:Integer = 5;

Si tu encapsulación no es tu prioridad. De lo contrario, use la segunda variante para exponer un método y no la variable.

private static final int FOO = 5; ... public static getFoo() { return FOO; }

También es una mejor práctica para que el mantenimiento de código no se base en variables. Recuerde que "la optimización prematura es la raíz de todo mal".