2012-01-31 21 views
24

La documentación del lenguaje Java dice "Si un tipo primitivo o una cadena se define como una constante y el valor se conoce en tiempo de compilación, el compilador reemplaza el nombre constante en todas partes en el código con su valor. se llama una constante de tiempo de compilación ".Constantes y variables de tiempo de compilación

Así que mi entendimiento es que si tenemos un trozo de código:

private final int x = 10; 

A continuación, el compilador reemplazará todas las apariciones de 'x' en el código con el literal '10'. Pero supongamos que dicen la constante se inicializa con el valor en tiempo de ejecución,

private final int x = getX(); // here getX() returns an integer value at run-time. 

Habrá alguna caída de rendimiento (independientemente de cuál sea insignificante) que puede ser comparada con la constante de tiempo de compilación?

Otra cuestión es si la línea debajo de código:

private int y = 10; // here y is not final 

es tratado de la misma manera constante por el compilador tiempo de compilación?

EDIT: Por último, lo que entiendo de las respuestas son:

  1. final static medios de compilación constante de tiempo
  2. simplemente final significa que es una constante, sino que se ha inicializado en tiempo de ejecución
  3. simplemente static significa inicializado en el tiempo de ejecución
  4. sin final es una variable y no se tratará como constante.

es mi entendimiento correcto?

+5

sobre el punto 2. ¡Estás equivocado! final int a = 1; a es una constante de tiempo de compilación. final int b; b = 1; b no es – landry

Respuesta

41

tiempo de compilación constante debe ser:

  • declarados finales
  • primitivo o de cadena
  • inicializado dentro declaración
  • inicializado con la expresión de la constante

Así private final int x = getX(); no es constante .

La segunda pregunta private int y = 10; no es constante (no es definitiva en este caso), por lo que el optimizador no puede estar seguro de que el valor no cambie en el futuro. Por lo tanto, no puede optimizarlo tan bien como el valor constante. La respuesta es: No, no se trata de la misma manera que la constante de tiempo de compilación.

+2

JLS que define la expresión constante: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28 –

+1

un ejemplo más para aclarar la duda: final int a = 1; es una constante de tiempo de compilación pero final int a; a = 2; no es –

+0

, creo que se puede inicializar dentro de la declaración o dentro del constuctor –

1

Hay podría ser una muy pequeña gota rendimiento en algunos máquinas para private final int x = getX(); ya que ello implica al menos una llamada al método (además del hecho de que esto no es una constante en tiempo de compilación) pero a medida que dijo, sería insignificante ¿por qué molestarse?

En cuanto a la segunda pregunta: y no es final y por lo tanto no es una constante de tiempo de compilación, ya que podría cambiar en el tiempo de ejecución.

1

private final int x = getX(); Se llamará la primera vez que se declare su objeto. La "caída" de rendimiento dependerá de getX(), pero ese no es el tipo de cosas para crear un cuello de botella.

2

La palabra clave final significa que una variable se inicializará una sola vez. Una necesidad real constante de ser declarado static también. Entonces, ninguno de sus ejemplos es tratado como constantes por el compilador. Sin embargo, la palabra clave final le dice (y al compilador) que sus variables se inicializarán una sola vez (en el constructor o literalmente). Si necesita que sus valores estén asignados en tiempo de compilación, sus campos deben ser estáticos.

El rendimiento no es tan afectado, pero tenga en cuenta que los tipos primitivos son inmutables; una vez que haya creado uno, mantendrá ese valor en la memoria hasta que el recolector de basura lo elimine. Entonces, si tiene una variable y = 1; y luego la cambia a y = 2; en la memoria, la JVM tendrá ambos valores, pero su variable "apuntará" a la última.

private int y = 10; // aquí y no es final

se trata de la misma manera que la compilación de constantes de tiempo por el compilador?

No. Se trata de una variable de instancia, creada, inicializada y utilizada en tiempo de ejecución.

0

Según JLS, no es necesario que la "variable constante" sea estática.

Por lo tanto, la "variable constante" puede ser estática o no estática (variable de instancia).

Pero JLS impone algunos otros requisitos para que una variable sea una "variable constante" (aparte de ser simplemente final):

  • siendo única cadena o primitivo
  • inicializados en línea única, ya que es final, y en blanco final no está permitido
  • inicializa con "expresión constante" = "en tiempo de compilación expresión constante" (véase la cita de JLS continuación)

4.12.4. final Variables (JLS)

A constante variable de es una variable final del tipo primitivo o tipo cadena que se inicializa con una expresión constante (§15.28).

15.28. Constant Expressions

A de tiempo de compilación expresión constante es una expresión que denota un valor de tipo primitivo o una cadena que no complete bruscamente y es compuesta utilizando sólo el siguiente:

Literales de tipo primitivo y literales de tipo Cadena (§3.10.1, §3.10.2, §3.10.3, §3.10.4, §3.10.5)

Se transfiere a tipos y conversiones primitivos para que escriba String (§15.16)

Los operadores unarios +, -, ~ y! (Pero no ++ o -) (§15.15.3, §15.15.4, §15.15.5, §15.15.6)

Los operadores multiplicativos *, /, y% (§15.17)

Los operadores aditivos + y - (§15.18)

Los operadores de desplazamiento < <, >>, y >>> (§15.19)

Los operadores relacionales <, < =,> y> = (pero no instanceof) (§15.20)

Los operadores de igualdad == y! = (§15.21)

Los operadores lógicos y en bits &,^y | (§15.22)

El operador condicional y & & y el operador condicional o || (§15.23, §15.24)

¿El operador condicional ternario? : (§15.25)

Expresiones en paréntesis (§15.8.5) cuya expresión contenida es una expresión constante .

Nombres simples (§6.5.6.1) que se refieren a variables constantes (§4.12.4).

Nombres calificados (§6.5.6.2) de la forma TypeName. El identificador que se refiere a variables constantes (§4.12.4).

Cuestiones relacionadas