¿Por qué no hay una característica constante en Java?


Estaba tratando de identificar la razón detrás de las constantes en Java He aprendido que Java nos permite declarar constantes usando la palabra clave final.

Mi pregunta es por qué Java no introdujo una característica Constante (const). Dado que mucha gente dice que ha venido de C++, en C++ tenemos la palabra clave const.

Por favor comparta sus pensamientos.

Author: user207421, 2010-04-29

8 answers

Cada vez que paso de codificación C++ pesada a Java, me lleva un poco de tiempo adaptarme a la falta de corrección de la constancia en Java. Este uso de const en C++ es muy diferente a simplemente declarar variables constantes, si no lo sabía. Esencialmente, garantiza que un objeto sea inmutable cuando se accede a través de un tipo especial de puntero llamado const-pointer Cuando está en Java, en lugares donde normalmente querría devolver un const-pointer, en su lugar devuelvo una referencia con una interfaz tipo que contiene solo métodos que no deberían tener efectos secundarios. Desafortunadamente, esto no es impuesto por el langauge.

Wikipedia ofrece la siguiente información sobre el tema:

Curiosamente, la especificación del lenguaje Java considera const como una palabra clave reservada, es decir, una que no se puede usar como identificador de variable, pero no le asigna semántica. Se cree que la reserva de la palabra clave se produjo para permitir una extensión del lenguaje Java para incluir Métodos const estilo C++y puntero al tipo const. El ticket de solicitud de mejora en el Proceso de la Comunidad Java para implementar la corrección de const en Java se cerró en 2005, lo que implica que la corrección de const probablemente nunca encontrará su camino en la especificación oficial de Java.

 130
Author: Gunslinger47,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-29 08:49:57

¿Qué significa const
Primero, date cuenta de que la semántica de una palabra clave "const" significa diferentes cosas para diferentes personas:

  • referencia de solo lectura - Semántica de Java final - la variable de referencia en sí no se puede reasignar para apuntar a otra instancia (ubicación de memoria), pero la instancia en sí es modificable
  • referencia solo legible - C const semántica de puntero/referencia-significa que esta referencia no se puede usar para modificar instancia (por ejemplo, no se puede asignar a variables de instancia, no se pueden invocar métodos mutables) - afecta solo a la variable de referencia, por lo que una referencia no constante que apunte a la misma instancia podría modificar la instancia
  • objeto inmutable - significa que la instancia en sí no se puede modificar-se aplica a la instancia, por lo que cualquier referencia no constante no se permitiría o no se podría usar para modificar la instancia
  • alguna combinación de la la arriba ?
  • otros ?

Por qué o por Qué No const
En segundo lugar, si realmente desea profundizar en algunos de los argumentos "pro" vs "con", consulte la discusión bajo este "bug"de solicitud de mejora (RFE). Este RFE solicita una función de"solo referencia legible "de tipo" const". Abierto en 1999 y luego cerrado / rechazado por Sun en 2005, el tema" const " fue vigorosamente debate:

Http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070

Si bien hay muchos buenos argumentos en ambos lados, algunas de las razones frecuentemente citadas (pero no necesariamente convincentes o claras) en contra de const incluyen:

  • puede tener una semántica confusa que puede ser mal utilizada y / o abusada (ver el Qué significa const anterior)
  • puede duplicar la capacidad disponible de otro modo (por ejemplo, diseñar una clase inmutable, utilizando un interfaz inmutable)
  • puede ser arrastramiento de características, lo que lleva a la necesidad de otros cambios semánticos, como el soporte para pasar objetos por valor

Antes de que alguien intente debatirme acerca de si estas son buenas o malas razones, note que estas son no mis razones. Son simplemente la" esencia " de algunas de las razones que deduje de hojear la discusión de RFE. No necesariamente estoy de acuerdo con ellos-simplemente estoy tratando de citar por qué algunas personas (no yo) pueden sentir un const la palabra clave puede no ser una buena idea. Personalmente, me encantaría que se introdujera más semántica de "const" en el lenguaje de una manera inequívoca.

 78
Author: Bert F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-19 11:40:30

const 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 expresión const cambia se hace más evidente si se encuentra en un entorno que admite la concurrencia basada en subprocesos.

Como Java fue diseñado desde el principio para soportar la concurrencia de subprocesos y bloqueos, no agregó confusión al sobrecargar el término para tener la semántica que final tiene.

Eg:

#include <iostream>

int main ()
{
    volatile const int x = 42;

    std::cout << x << std::endl;

    *const_cast<int*>(&x) = 7;

    std::cout << x << std::endl;

    return 0;
}

Produce 42 y luego 7.

Aunque x marcado como const, como se crea un alias no constante, x no es una constante. No todos compilador requiere volatile para este comportamiento (aunque cada compilador es permitido en línea el 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 tu código no puede cambiarlo sin un cast, no que el valor sea constante.

 7
Author: Pete Kirkham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-29 14:27:23

Esta es una pregunta un poco vieja, pero pensé que contribuiría mis 2 centavos de todos modos ya que este hilo surgió en la conversación de hoy.

Esto no responde exactamente ¿por qué no hay const?pero cómo hacer que tus clases sean inmutables. (Desafortunadamente no tengo suficiente reputación todavía 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 cuidado que una clase mutable.

Esto se remonta al Java efectivo de Josh Bloch Item 15-Minimize Mutability. Si no has leído el libro, coge una copia y léela unas cuantas veces te garantizo que subirá tu figurativo "java game".

En el ítem 15 Bloch sugiere que debe limitar la mutabilidad de las clases para asegurar el estado del objeto.

Para citar el libro directamente:

Una clase inmutable es simplemente una clase cuyas instancias no se puede modificar. Toda la información contenida en cada instancia se proporciona cuando se crea y se corrige durante la vida útil del objeto. Las bibliotecas de la plataforma Java contienen muchas clases inmutables, incluyendo String, las clases primitivas en caja, y BigInte-ger y BigDecimal. Hay muchas buenas razones para esto: Las clases inmutables son más fáciles de diseñar, implementar y usar que las clases mutables. Son menos propensos a errores y son más seguros.

Bloch luego describe cómo para hacer sus clases inmutables, siguiendo 5 reglas simples:

  1. No proporcione ningún método que modifique el estado del objeto (es decir, setters, aka mutators)
  2. Asegúrese de que la clase no se puede extender (esto significa declarar la clase en sí como final).
  3. Crea todos los campos final.
  4. Crea todos los campos private.
  5. Garantizar el acceso exclusivo a cualquier componente mutable. (haciendo copias defensivas de los objetos)

Para más detalles I recomiendo encarecidamente recoger una copia del libro.

 4
Author: grego,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-07 19:36:02

La semántica en C++ de const es muy diferente de Java final. Si los diseñadores hubieran utilizado const habría sido innecesariamente confuso.

El hecho de que const es una palabra reservada sugiere que los diseñadores tenían ideas para implementar const, pero desde entonces han decidido no hacerlo; ver este error cerrado. Las razones indicadas incluyen que agregar soporte para el estilo C++ const causaría problemas de compatibilidad.

 3
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-29 16:02:11

Hay una forma de crear variables "const" en Java, pero solo para clases específicas. Simplemente defina una clase con propiedades finales y subclase. Luego usa la clase base donde quieras usar "const". Del mismo modo, si necesita usar 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 de la subclase.

 -1
Author: user1122069,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-07 02:14:52

Habría dos formas de definir constantes - const y static final, con la misma semántica. Además static final describe el comportamiento mejor que const

 -2
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-29 08:45:17

He oído un rumor de que el uso de Enums en Java es malo para el rendimiento del juego. No estoy seguro de por qué. Const funcionaría mejor...

Ejemplos de uso de CONST en la vida real en Java... sólo codifícalo así... y luego sus declaraciones de switch funcionarán sin quejarse..

protected static final int cOTHER = 0;
protected static final int cRPM = 1;
protected static final int cSPEED = 2;
protected static final int cTPS = 3;
protected int DataItemEnum = 0;

public static final int INVALID_PIN = -1;
public static final int LED_PIN = 0;

.

switch (this.DataItemEnum) {
    case cRPM:
        percent = (Value - 0.001*Min)/(Max - Min);
        break;
    default:
        percent  = (Value - Min)/(Max - Min);
        break
}
 -2
Author: hamish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-17 23:37:25