149 votes

Pourquoi n'y a-t-il pas de mot-clé Constant en Java ?

J'essayais d'identifier la raison derrière le "CONSTANTS" en Java J'ai appris que Java nous permet de déclarer des constantes en utilisant final mot-clé.

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

Veuillez partager vos réflexions.

2 votes

Il y a est a const mais il n'y a pas de caractéristique sous-jacente. J'ai corrigé votre titre et vos balises en conséquence.

149voto

Gunslinger47 Points 5166

Chaque fois que je passe d'un codage C++ lourd à Java, il me faut un peu de temps pour m'adapter à l'absence d'outils de gestion de la qualité. const-correctness en Java. Cette utilisation de const en C++ est bien différent de la simple déclaration de variables constantes, si vous ne le saviez pas. En Java, dans les endroits où je devrais normalement renvoyer un pointeur constant, je renvoie à la place une référence avec un type d'interface contenant uniquement les méthodes qui ne devraient pas avoir d'effets secondaires. Malheureusement, ceci n'est pas imposé par le langage.

Wikipedia offre les informations suivantes sur le sujet :

Il est intéressant de noter que la spécification du langage Java considère const comme un mot-clé réservé - c'est-à-dire qui ne peut pas être utilisé comme identifiant de variable - mais ne lui attribue aucune sémantique. On pense que la réservation du mot-clé a eu lieu pour permettre une extension du langage Java afin d'inclure des méthodes const de style C++ et des pointeurs de type const. Le ticket de demande d'amélioration dans le processus communautaire Java pour la mise en œuvre de la correction des constantes dans Java a été fermé en 2005, ce qui implique que la correction des constantes ne trouvera probablement jamais sa place dans la spécification officielle de Java.

10 votes

Java final est similaire, cependant.

68 votes

Non, ça ne l'est pas. final par exemple, fonctionnent de manière complètement différente de la méthode C++ const méthodes.

9 votes

@reinierpost Le final mot-clé sur des propriétés ou des variables garantit simplement qu'une propriété ou une variable n'est affectée qu'à une fois . On peut toujours modifier l'état de cet objet en appelant, par exemple, une méthode ayant des effets secondaires. final est un peu similaire à l'allocation de pile du C++ en termes de référence à un objet plutôt qu'à un pointeur, mais c'est tout ce que c'est. Ceci est bien sûr en plus de ce que dom0 a déjà dit.

85voto

Bert F Points 27237

Qu'est-ce que const moyenne
Tout d'abord, sachez que la sémantique d'un mot-clé "const" a une signification différente selon les personnes :

  • référence en lecture seule - Java final sémantique - la variable de 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 sémantique du pointeur/référence - signifie que cette référence ne peut pas être utilisée pour modifier l'instance (par exemple, elle ne peut pas être assignée à des variables d'instance, ni invoquer des méthodes mutables) - affecte uniquement la variable de référence, de sorte qu'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 conforme ne serait pas autorisée ou ne pourrait pas être utilisée pour modifier l'instance.
  • une combinaison des éléments ci-dessus ?
  • autres ?

Pourquoi ou pourquoi pas const
Deuxièmement, si vous voulez vraiment approfondir certains des arguments "pour" et "contre", consultez la discussion sur ce "bug" de demande d'amélioration (RFE). Cette RFE demande une fonctionnalité "const" de type "référence lisible uniquement". Ouvert en 1999, puis fermé/rejeté par Sun en 2005, le sujet "const" a été vigoureusement débattu :

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

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 claires) contre const inclure :

  • peuvent avoir une sémantique déroutante qui peut être utilisée à mauvais escient et/ou de manière abusive (voir l Qu'est-ce que const moyenne ci-dessus)
  • peut dupliquer une capacité autrement disponible (par exemple, en concevant une classe immuable, en utilisant une interface immuable)
  • peut être un glissement de fonctionnalité, conduisant à la nécessité d'autres changements sémantiques tels que la prise en charge du passage d'objets par valeur.

Avant que quelqu'un n'essaie de débattre de la question de savoir si ce sont de bonnes ou de mauvaises raisons, notez qu'il s'agit de pas mes raisons . Il s'agit simplement de l'essentiel de certaines des raisons que j'ai glanées en parcourant la discussion sur les RFE. Je ne suis pas nécessairement d'accord avec ces raisons - j'essaie simplement de citer les raisons pour lesquelles certaines personnes (pas moi) peuvent ressentir un sentiment d'insécurité. const mot-clé n'est peut-être pas une bonne idée. Personnellement, j'aimerais que davantage de sémantique "const" soit introduite dans le langage de manière non ambiguë.

2 votes

+1 juste pour la deuxième partie de votre réponse. De nombreux mots-clés ont une sémantique non triviale. Est-ce que volatile si simple à comprendre ? Ou final ? Meh.

0 votes

En revanche, Java a été conçu pour utiliser le moins possible de ces fonctionnalités non triviales. Et je ne dis pas qu'ils ont atteint cet objectif (ou que Java ne s'est pas éloigné de cet objectif). Mais l'exclure pour cette raison aurait pu avoir du mérite. Le fait qu'il y ait d'autres choses compliquées est une raison de plus pour que l'on s'y intéresse. de ne pas introduire plus (ou vous vous retrouveriez avec la langue D).

14voto

GaryF Points 11921

Const n'est pas utilisé parce que vous ne pouvez pas imposer le fait qu'une valeur soit constante en Java. Il s'agirait donc d'un terme mal choisi. Final est sans doute (bien que subjectivement) un meilleur nom, car il indique que la variable est la référence finale (elle ne peut pas être réaffectée).

Pour l'anecdote, const est un mot-clé réservé mais inutilisé en Java.

7voto

Pete Kirkham Points 32484

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 en altérer la valeur.

Si la valeur d'un const Les changements d'expression deviennent plus évidents si vous êtes dans un environnement qui supporte la concurrence basée sur les threads.

Java ayant été conçu dès le départ pour prendre en charge la concurrence entre les threads et les verrous, il n'a pas ajouté à la confusion en surchargeant le terme pour qu'il ait la sémantique que l'on connaît aujourd'hui. final a.

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

sorties 42 puis 7.

Bien que x marqué comme const car un alias non-constant est créé, x n'est pas une constante. Tous les compilateurs n'exigent pas volatile pour ce comportement (bien que chaque compilateur soit autorisé à mettre la constante en ligne).

Avec des systèmes plus compliqués, vous obtenez des alias const/non-const sans l'utilisation de const_cast Il est donc de plus en plus dangereux de prendre l'habitude de penser que la constance signifie que quelque chose ne changera pas. const signifie simplement que votre code ne peut pas la modifier sans un cast, et non que la valeur est constante.

3 votes

const int x = 42 ; - x est une constante

0 votes

@Neil Je pense qu'il parle d'objets.

0 votes

@andy Fonctionne de la même manière pour les objets.

-2voto

Bozho Points 273663

Il y aurait deux façons de définir des constantes - const et static final avec exactement la même sémantique. En outre, static final décrit le comportement mieux que const

0 votes

@Bozho, vous avez dit "meilleur comportement que Const", de quoi s'agit-il ? pouvez-vous nous donner un exemple ?

0 votes

Eh bien, la variable est static (n'appartenant pas à une instance particulière) et final - ne peut pas être modifié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X