web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de fonctionnalité Constante en Java?

J'essayais d'identifier la raison derrière les constantes dans Java). J'ai appris que Java nous permet de déclarer des constantes à l'aide de final mot-clé.

Ma question est de savoir pourquoi Java n'a pas introduit la fonctionnalité Constante (const). Comme beaucoup de gens disent que cela vient du C++, en C++, nous avons const mot-clé.

S'il vous plaît partagez vos pensées.

134
gmhk

Chaque fois que je passe du codage C++ lourd à Java, il me faut un peu de temps pour m'adapter au manque de const-correctness en Java. Cette utilisation de const en C++ est très différente de la simple déclaration de variables constantes, si vous ne le saviez pas. Cela garantit essentiellement qu'un objet est immuable lorsqu'il est accédé via un type spécial de pointeur appelé const-pointer. En Java, là où je voudrais normalement renvoyer un pointeur const, je renvoie plutôt une référence avec un type d'interface. ne contenant que des méthodes qui ne devraient pas avoir d’effets secondaires. Malheureusement, ce n'est pas imposé par le langage.

Wikipedia offre les informations suivantes sur le sujet:

Fait intéressant, la spécification de langage Java considère const comme un mot clé réservé - c'est-à-dire, qui ne peut pas être utilisé comme identificateur de variable - mais ne lui attribue aucune sémantique. On pense que la réservation du mot clé a eu lieu permettre une extension du langage Java afin d'inclure les méthodes const de style C++ et le pointeur sur le type const. Le ticket de demande d'amélioration dans le processus de communauté Java de implémentation de la correction de const dans Java a été fermé en 2005, ce qui implique que la correction de const ne se retrouvera probablement jamais dans la spécification officielle Java.

137
Gunslinger47

Que signifie const
Tout d’abord, sachez que la sémantique d’un mot clé "const" signifie différentes choses pour différentes personnes:

  • référence en lecture seule - Java final sémantique - la variable référence elle-même ne peut pas être réaffectée pour pointer vers une autre instance (emplacement mémoire), mais l'instance elle-même est modifiable
  • référence en lecture seule - C const pointeur/référence sémantique - signifie que cette référence ne peut pas être utilisée pour modifier l'instance (par exemple, impossible d'affecter des variables d'instance, ni d'appeler des méthodes mutables) - affecte uniquement la variable de référence, donc une référence non-const pointant vers la même instance pourrait modifier l'instance
  • objet immuable - signifie que l'instance elle-même ne peut pas être modifiée - s'applique à l'instance, de sorte que toute référence non-const ne serait pas autorisée ou ne pourrait pas être utilisée pour modifier l'instance
  • une combinaison de ce qui précède?
  • autres?

Pourquoi ou pourquoi pas const
Deuxièmement, si vous voulez vraiment creuser certains des arguments "pro" contre "con", consultez la discussion sous cette "bogue" d'amélioration (RFE). Ce RFE demande une fonctionnalité de type "référence uniquement", de type "const". Ouvert en 1999 puis fermé/rejeté par Sun en 2005, le sujet "const" a été vivement débattu:

http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id=421107

Bien qu'il y ait beaucoup de bons arguments des deux côtés, certaines des raisons souvent citées (mais pas nécessairement convaincantes ou bien définies) contre const incluent:

  • peut avoir une sémantique déroutante qui peut être mal utilisée et/ou maltraitée (voir le Que signifie const signifie-t-il ci-dessus)
  • peut dupliquer une capacité disponible par ailleurs (par exemple, concevoir une classe immuable, en utilisant une interface immuable)
  • peut être un glissement de fonctionnalité, nécessitant d'autres modifications sémantiques telles que la prise en charge du passage d'objets par valeur

Avant que quiconque essaie de débattre de moi pour savoir si ce sont des bonnes ou des mauvaises raisons, notez que ce sont pas mes raisons. Ce sont simplement les "points essentiels" de certaines des raisons que j’ai glanées en écumant la discussion sur la RFE. Je ne suis pas nécessairement d'accord avec eux-mêmes. J'essaie simplement de citer pourquoi certaines personnes (pas moi) peuvent avoir l'impression qu'un mot clé const n'est peut-être pas une bonne idée. Personnellement, j'aimerais que davantage de sémantique "const" soit introduite dans la langue de manière non ambiguë.

81
Bert F

const en C++ ne signifie pas qu'une valeur est une constante.

const en C++ implique que le client d'un contrat s'engage à ne pas modifier sa valeur.

Le changement de la valeur d'une expression const devient plus évident si vous vous trouvez dans un environnement prenant en charge la simultanéité basée sur les threads.

Comme Java a été conçu dès le départ pour prendre en charge la concurrence des threads et des verrous, il n’a pas ajouté à la confusion en surchargeant le terme pour avoir la sémantique que final a.

par exemple:

#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;
}

les sorties 42 puis 7.

Bien que x marqué comme const, lorsqu'un alias non-const soit créé, x n'est pas une constante. Tous les compilateurs n'ont pas besoin de volatile pour ce comportement (même si chaque compilateur est autorisé à insérer la constante en ligne)

Avec des systèmes plus compliqués, vous obtenez des alias const/non-const sans utiliser const_cast, prendre l'habitude de penser que cela signifie que quelque chose ne changera pas devient de plus en plus dangereux. const signifie simplement que votre code ne peut pas le changer sans casting, pas que la valeur soit constante.

7
Pete Kirkham

C'est une question un peu ancienne, mais je pensais apporter mes 2 centimes de toute façon puisque ce fil a été abordé aujourd'hui.

Cela ne répond pas exactement pourquoi n'y a-t-il pas de const? mais comment pour rendre vos cours immuables. (Malheureusement, je n'ai pas encore assez de réputation pour publier un commentaire sur la réponse acceptée)

La manière de garantir l’immuabilité sur un objet est de concevoir vos classes avec plus de soin pour qu’elles soient immuables. Cela nécessite un peu plus de soin qu'une classe mutable.

Cela remonte à Effective Java de Josh Bloch élément 15 - minimisation de la mutabilité. Si vous n'avez pas lu le livre, prenez-en un exemplaire et relisez-le plusieurs fois, je vous garantis que votre figuration figurera (== --- ==) comme un "jeu Java" .

Au point 15, Bloch suggère de limiter la mutabilité des classes pour garantir l'état de l'objet.

Pour citer le livre directement:

Une classe immuable est simplement une classe dont les instances ne peuvent pas être modifiées. Toutes les informations contenues dans chaque instance sont fournies lors de sa création et sont fixes pour la durée de vie de l'objet. Les bibliothèques de la plate-forme Java contiennent de nombreuses classes immuables, y compris String, les classes primitives encadrées, BigInteger et BigDecimal. Il existe de nombreuses bonnes raisons à cela. Les classes immuables sont plus faciles à concevoir, à mettre en œuvre, et utilisables que les classes mutables: elles sont moins sujettes aux erreurs et sont plus sécurisées.

Bloch explique ensuite comment rendre vos classes immuables en suivant 5 règles simples:

  1. Ne fournissez aucune méthode qui modifie l’état de l’objet (à savoir, des setters, autrement dit des mutateurs )
  2. Assurez-vous que la classe ne peut pas être étendue (cela signifie que vous déclarez la classe elle-même en tant que final).
  3. Rendre tous les champs final.
  4. Rendre tous les champs private.
  5. Assure un accès exclusif à tous les composants mutables. (en faisant des copies défensives des objets)

Pour plus de détails, je recommande fortement de prendre un exemplaire du livre.

5
grego

La sémantique C++ de const est très différente de Java final. Si les concepteurs avaient utilisé const, cela aurait été inutilement déroutant.

Le fait que const soit un mot réservé suggère que les concepteurs avaient des idées pour implémenter const, mais ils ont depuis décidé de ne pas le faire. voir ce bogue fermé . Les raisons énoncées incluent que l'ajout de la prise en charge du style C++ const poserait des problèmes de compatibilité.

3
Stephen C