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 finalpalabras 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 constpalabras clave.
Por favor comparte tus pensamientos.

constpalabra 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
consten 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
finalembargo, Java es similar.finalmétodo, por ejemplo, funciona completamente diferente de losconstmétodos de C ++ .finalpalabra 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.finales 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.finalen Java parece funcionar como C ++constpara los tipos de valor, pero más como un C ++ no constanteT¶ los tipos de referenciaLo que
constsignificaPrimero, date cuenta de que la semántica de una palabra clave "const" significa cosas diferentes para diferentes personas:
finalSemá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 modificableconstpuntero / 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
constsegundo 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)
constincluyen:constsignifica 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
constpalabra 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
volatiletan simple de entender? Ofinal? Mehconsten C ++ no significa que un valor sea una constante.consten C ++ implica que el cliente de un contrato se compromete a no alterar su valor.Si el valor de una
constexpresió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
finaltiene.p.ej:
salidas 42 y luego 7.
Aunque
xmarcado comoconst, a medida que se crea un aliasxno constante , no es una constante. No todos los compiladores requierenvolatileeste 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.constsimplemente significa que su código no puede cambiarlo sin una conversión, no que el valor sea constante.fuente
constlo 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.constafecta a los clientes, no al valor: dice que no puede cambiarlo, no es que no cambie.immutable interfaceyimmutable objectes 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 ++
constes muy diferente de Javafinal. Si los diseñadores lo hubieran usadoconst, habría sido innecesariamente confuso.El hecho de que
constsea 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 ++constcausarí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,
constystatic finalcon la misma semántica. Ademásstatic finaldescribe el comportamiento mejor queconstfuente
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