2009-02-02 6 views

Respuesta

14

No, no lo hay.

Java "final" no es un equivalente exacto de C++ "const". La siguiente (inicialización de una variable retardada final) funciona en Java:

final double x; 
int w = 1; 
if (w > 2) 
{ 
    x = 0.5; 
} 
else 
{ 
    x = - 0.5; 
} 

pero no funciona en C++ con "final" sustituye por "const".

Usar "final" en una variable en la declaración del método puede ser útil en Java, porque le permite usar esta variable dentro de cualquier clase anónima creada dentro de su método.

PS. Primero me decepcionó la falta de "const" en Java pero luego aprendí a vivir con "final".

PS2. El glosario de Java (http://mindprod.com/jgloss/immutable.html) ligado a este hilo tiene una cosa mal: no, no se les da un guaranntee 100% que la última variable no cambia su valor:

1) cambia de "indefinido" para "definido", pero el compilador le dirá si lo referencia antes de la inicialización

2) en Linux, un doble tiene una precisión de 80 bits cuando se almacena en un registro, pero 64 bits cuando se almacena en la memoria. Cuando una variable doble final se saca del registro, se trunca y cambia su valor. Como dice Joel Spolsky, "la abstracción ha surgido una fuga".

1

ver este para lograr esto en Java: Immutable objects in Java

+0

Ese es el peor sitio que he visto ...:/ –

+0

Agregó un nuevo enlace .. – Naveen

+0

@Filip: ¿Cuál? ¿MindPod? –

0

El equivalente más cercano de Java para const es final.

void func(final SomeClass x) { 
    // The following causes a compiler error 
    x = ...; 

    // The following works. If you don't want it to, then you have to make 
    // somevar final or write a getter (but not a setter) for it in SomeClass. 
    x.somevar = ...; 
} 
+2

Dado el segundo comentario, diría que el final no es "equivalente" a la const de C++ en primer lugar. –

8

Java no tiene nada como la noción de const de C++ Es un punto de cierta contención, aunque es interesante notar que .NET tampoco. Creo que las razones son:

  • Conseguir sintaxis comprensible vuelve bastante complicado (OMI) - decir la diferencia entre una lista de const StringBuilders mutables y una lista de mutable StringBuilders const etc es difícil. (Ciertamente lo encontré difícil en C++, aunque podría deberse a la falta de práctica.)
  • Sospecho que no sería aceptable permitir que la constidad se elimine en los idiomas administrados. Sería contra corriente. Eso podría hacerlos más difíciles de trabajar en muchos casos.
  • Propagar la información sobre constness en el tiempo de ejecución (para evitar la posibilidad de que se descarte) puede ser difícil y/o costoso en términos de rendimiento
  • Ya que Java (y .NET) no han tenido constness en el pasado , introducirlo tarde en el juego es enormemente difícil - a menos que todas las librerías comunes lo soporten (y obténgalo right en cada paso!) terminas con una desagradable mezcolanza, y de hecho puede ser completamente inviable si necesitas para usar dos bibliotecas, una de las cuales no sabe sobre constness y la otra solo proporciona valores const.
1

Como arriba, no hay const en Java. Pero cuando queremos lograr 'cerca' al mismo resultado en Java utilizamos

public static final Object x = somedata; 

Esto establece los datos en ese punto y dejando al descubierto las fugas de abstracción y así sucesivamente, usted tiene lo más cercano a un equivalente que pueda obtener.

5

BTW: Java tiene const como palabra clave, pero no se puede usar en ninguna parte.

Cuestiones relacionadas