¿Cuáles son tus pensamientos sobre las constantes del alcance del método?

StackOverflow https://stackoverflow.com/questions/244191

  •  04-07-2019
  •  | 
  •  

Pregunta

Por ejemplo:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

    // ...  
}

Personalmente, preferiría ver estas constantes de sustitución declaradas estáticamente a nivel de clase. Supongo que estoy buscando un "punto de vista de la industria" en la materia.

¿Fue útil?

Solución

Mi posición inicial es que cada variable o constante debe declararse / inicializarse tan cerca de su primer uso como sea posible / práctico (es decir, no rompa un bloque lógico de código a la mitad, solo para declarar algunas líneas más cerca), y con el alcance lo más ajustado posible. - A menos que puedas darme una buena razón por qué debería ser diferente.

Por ejemplo, un método con alcance final no será visible en la API pública. A veces, este bit de información podría ser útil para los usuarios de su clase y debería ser movido hacia arriba.

En el ejemplo que dio en la pregunta, yo diría que MIN_INTEREST es probablemente una de esas piezas de información que a un usuario le gustaría tener en sus manos, y debería estar dentro del alcance de la clase, no del método. (Aunque, no hay un contexto para el código de ejemplo, y mi suposición podría ser completamente errónea).

Otros consejos

Pienso que solo deberías ponerlos en el nivel de clase si son utilizados por múltiples métodos. Si solo se usa en ese método, me parece bien.

Técnicamente, no existe tal cosa como un " constante del alcance del método " en java A lo que te refieres es simplemente una variable local final; se crea un destruido con cada invocación de método.

http://www.java-tips.org/java-se-tips/java.lang/how-do-i-declare-a-constant-in-java.html

La ocultación de la información y la modularidad son principios clave, y el alcance estrecho es una mejor ocultación de la información. Si la constante solo es necesaria por el método, la ocultación es buena. Si y cuando la constante sea útil en otros lugares, expóngala a un alcance más amplio, pero solo tan ampliamente como sea necesario.

Probablemente esté preocupado porque esta es una constante y, por lo tanto, puede parecer que pertenece a alguna tabla de propiedades globales. Tal vez lo haga. Tal vez no sea así. Su preocupación es válida, pero no hay un mejor lugar para todas las constantes.

He usado este método constantes de alcance, pero de vez en cuando un colega lo modifica durante las revisiones de código. Nuevamente, estos colegas no están interesados ??en la lectura / escritura de código abierto, pero están acostumbrados al software empresarial.

Les digo que NO tiene sentido usar una constante de nivel de clase si se usa dentro de un solo método, pero he encontrado que más de un colega insiste en que se mueva hacia ARRIBA. Normalmente cumplo, ya que no soy tan rígido a menos que afecte la legibilidad y / o el rendimiento.

Tengo una opinión diferente sobre esto: en mi humilde opinión es mejor ubicarlos en el ámbito de archivo / clase, especialmente si está trabajando en equipos por este motivo: digamos que comienza con un pequeño código ...

public void doSomething() {

  final double MIN_INTEREST = 0.0;

  // ...  
}

y otros miembros de su equipo amplían la clase con un montón de métodos y ahora la clase es una clase gigante maravillosa de 500 líneas / 50 métodos . Imagine la experiencia de un ingeniero que intenta agregar un nuevo método con una constante, tendrán que 1 escanear a toda la clase en busca de constantes que coincidan con sus necesidades, 2 mueva la constante al ámbito de la clase con la esperanza de que no haya conflictos con el código existente y 3 también agregue su método.

Para empezar, si agrega todas las constantes en el ámbito de archivo / clase, los ingenieros tienen un lugar único 1 para buscar las constantes existentes y, 2 derivan algunas constantes de otros donde tiene sentido. (por ejemplo, si tiene una constante para pi , es posible que también desee definir una nueva constante con un valor de pi / 2 ).

La razón por la que puede definir una variable final a nivel de clase o nivel de método (local) es porque puede anular la constante estática global dentro del método (local).

Ejemplo:

public class Test {

    final double MIN_INTEREST = 0.0;

    /**
     * @param args
     */
    public static void main(String[] args) {


        Test test = new Test();

        test.doSomethingLocal();
        test.doSomethingGlobal();

    }

    public void doSomethingGlobal() {

        System.out.println("Global-> " + MIN_INTEREST);

    }

    public void doSomethingLocal() {

        final double MIN_INTEREST = 0.1;

        System.out.println("Local-> " + MIN_INTEREST);

    }
}

La salida será:

Local-> 0.1
Global-> 0.0

Así que tu pregunta no tiene ningún sentido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top