Estaba tratando de identificar la razón detrás de las constantes en Java. Aprendí que Java nos permite declarar constantes mediante el uso de final
palabras clave.
Mi pregunta es por qué Java no introdujo una característica Constant ( const
). Como muchas personas dicen que proviene de C ++, en C ++ tenemos const
palabras clave.
Por favor comparte tus pensamientos.
const
palabra clave, pero no hay ninguna característica subyacente. Corregido su título y etiquetas en consecuencia.Respuestas:
Cada vez que paso de la codificación C ++ pesada a Java, me lleva un tiempo adaptarme a la falta de corrección constante en Java. Este uso de
const
en C ++ es muy diferente a solo declarar variables constantes, si no lo sabía. Esencialmente, asegura que un objeto sea inmutable cuando se accede a él a través de un tipo especial de puntero llamado const-pointer. Cuando en Java, en lugares donde normalmente quisiera devolver un const-pointer, en su lugar devuelvo una referencia con un tipo de interfaz que contiene solo métodos que no deberían tener efectos secundarios. Desafortunadamente, esto no es impuesto por el idioma.Wikipedia ofrece la siguiente información sobre el tema:
fuente
final
embargo, Java es similar.final
método, por ejemplo, funciona completamente diferente de losconst
métodos de C ++ .final
palabra clave en propiedades o variables solo garantiza que una propiedad o variable solo se asigne a una vez . Todavía se podría alterar el estado de este objeto, por ejemplo, llamando a algún método con efectos secundarios.final
es algo similar a la asignación de pila de C ++ en términos de referirse a un objeto en lugar de un puntero, pero eso es todo. Esto es, por supuesto, además de lo que dom0 ya dijo.final
en Java parece funcionar como C ++const
para los tipos de valor, pero más como un C ++ no constanteT&
para los tipos de referenciaLo que
const
significaPrimero, date cuenta de que la semántica de una palabra clave "const" significa cosas diferentes para diferentes personas:
final
Semántica de Java - la variable de referencia en sí no puede reasignarse para que apunte a otra instancia (ubicación de memoria), pero la instancia en sí es modificableconst
puntero / semántica de referencia - significa que esta referencia no se puede usar para modificar la instancia (por ejemplo, no se puede asignar a variables de instancia, no se pueden invocar métodos mutables) - solo afecta a la variable de referencia, por lo que una referencia no constante que apunta a la misma instancia podría modificar la instanciaPor qué o por qué no en
const
segundo lugar, si realmente quiere profundizar en algunos de los argumentos "pro" vs "con", consulte la discusión bajo este "error" de solicitud de mejora (RFE). Este RFE solicita una característica "const" de "referencia de solo lectura". Abierto en 1999 y luego cerrado / rechazado por Sun en 2005, el tema "constante" se debatió vigorosamente:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
Si bien hay muchos buenos argumentos en ambos lados, algunas de las razones más frecuentemente citadas (pero no necesariamente convincentes o claras)
const
incluyen:const
significa arriba)Antes de que alguien trate de debatirme si estas son buenas o malas razones, tenga en cuenta que estas no son mis razones . Son simplemente la "esencia" de algunas de las razones por las que deduje eludir la discusión sobre RFE. No estoy necesariamente de acuerdo con ellos, simplemente estoy tratando de mencionar por qué algunas personas (no yo) pueden sentir que una
const
palabra clave puede no ser una buena idea. Personalmente, me encantaría que se introdujera más semántica "constante" en el lenguaje de una manera inequívoca.fuente
volatile
tan simple de entender? Ofinal
? Mehconst
en C ++ no significa que un valor sea una constante.const
en C ++ implica que el cliente de un contrato se compromete a no alterar su valor.Si el valor de una
const
expresión cambia se hace más evidente si se encuentra en un entorno que admite concurrencia basada en subprocesos.Como Java fue diseñado desde el principio para admitir subprocesos y bloquear la concurrencia, no aumentó la confusión al sobrecargar el término para tener la semántica que
final
tiene.p.ej:
salidas 42 y luego 7.
Aunque
x
marcado comoconst
, a medida que se crea un aliasx
no constante , no es una constante. No todos los compiladores requierenvolatile
este comportamiento (aunque todos los compiladores pueden alinear la constante)Con sistemas más complicados, obtienes alias const / non-const sin usar
const_cast
, por lo que adquirir el hábito de pensar que const significa que algo no cambiará se vuelve cada vez más peligroso.const
simplemente significa que su código no puede cambiarlo sin una conversión, no que el valor sea constante.fuente
const
lo tanto , no significa que un valor sea constante. Significa que el cliente de un valor está obligado a no mutarlo. En su ejemplo no hay alias, por lo que todos los usuarios están bajo la misma restricción. Este no es el caso en general.const
afecta a los clientes, no al valor: dice que no puede cambiarlo, no es que no cambie.immutable interface
yimmutable object
es otra forma (superable con reparto y reflexión) para imitar const en Java. Const "verdadero" se puede hacer con SealedObject , por desgracia, destruye el caso de uso de nuestro objeto.Esta es una pregunta un poco vieja, pero pensé que contribuiría con mis 2 centavos de todos modos, ya que este hilo salió a la conversación hoy.
Esto no responde exactamente por qué no hay constante? pero cómo hacer que tus clases sean inmutables. (Desafortunadamente aún no tengo suficiente reputación para publicar como un comentario a la respuesta aceptada)
La forma de garantizar la inmutabilidad de un objeto es diseñar sus clases con más cuidado para que sean inmutables. Esto requiere un poco más de cuidado que una clase mutable.
Esto se remonta a la efectiva Java de Josh Bloch artículo 15 de : minimizar la mutabilidad . Si no ha leído el libro, tome una copia y léala varias veces. Le garantizo que mejorará su figurado "juego de Java" .
En el elemento 15, Bloch sugiere que debe limitar la mutabilidad de las clases para garantizar el estado del objeto.
Para citar el libro directamente:
Bloch luego describe cómo hacer que sus clases sean inmutables, siguiendo 5 reglas simples:
final
).final
.private
.Para más detalles, recomiendo recoger una copia del libro.
fuente
La semántica de C ++
const
es muy diferente de Javafinal
. Si los diseñadores lo hubieran usadoconst
, habría sido innecesariamente confuso.El hecho de que
const
sea una palabra reservada sugiere que los diseñadores tenían ideas para implementarconst
, pero desde entonces han decidido no hacerlo; Mira este error cerrado . Las razones indicadas incluyen que agregar soporte para el estilo C ++const
causaría problemas de compatibilidad.fuente
Hay una manera de crear variables "const" en Java, pero solo para clases específicas. Simplemente defina una clase con propiedades finales y subclasifíquela. Luego use la clase base donde quiera usar "const". Del mismo modo, si necesita utilizar métodos "const", agréguelos a la clase base. El compilador no le permitirá modificar lo que cree que son los métodos finales de la clase base, pero leerá y llamará a los métodos en la subclase.
fuente
Habría dos formas de definir constantes,
const
ystatic final
con la misma semántica. Ademásstatic final
describe el comportamiento mejor queconst
fuente
static
(no perteneciente a una instancia particular) yfinal
- no se puede cambiar.Puede usar static final para crear algo que funcione de manera similar a Const, lo he usado en el pasado.
fuente