IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Intervalle au moyen d'un tableau


Sujet :

Collection et Stream Java

  1. #21
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Ah !?!
    Les static final sont des variables ???? je pensais que c'était des constantes quand il y a le mot clé final !

    OS : LinuxMint 20

  2. #22
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Non, je n'ai pas dit que les "static final" sont des variables ou pas. Je parlais des attributs de ta classes, qui sont seulement final et pas static.

    Si tu préfères le choix entre le lowerCamelCase et le UPPER_CASE ne dépend que de la présence des modifiers combinés "static final" (UPPER_CASE).

    Cette terminologie d'usage (constante ou variable, etc...) est une terminologie usuelle, dans laquelle :
    • constante pour beaucoup correspond à static final (bien que certains considèrent que constante est plus adapté aux valeurs litéralles) ;
    • et variable aux autres.


    Si on prend la documentation (ou celle-là) de Java : tout est "variable".

    Le mot-clef final rend juste une variable non-mutable (non-modifiable), non réellement constante (elle est constante pendant l'exécution du programme, mais ne l'est pas réellement, puisqu'elle peut prendre une autre valeur pour une autre exécution). Rigoureusement 42 est une constante, la constante de Planck est une constante, etc.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #23
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ouais, sauf que la notion de constante existe bel et bien en Java.

    C'est une variable :
    • final
    • de type primitif ou String
    • déclarée et initialisée dans la même instruction
    • initialisée par une expression constante. Les expressions constantes étant composées :
      • de littéraux (1, 17, "Bonjour", false)
      • d'autres constantes (si var est une constante, alors l'appeler est une expression constante)
      • d'opérateurs sur des expressions constantes (si var est une constante, alors 2 + var + 8 est une expression constante)


    Cette notion existe pour définir précisément les variables dont la valeur est connue du compilateur, donc à la compilation et avant l'exécution.
    Elle annonce quand le compilateur va faire certaines optimisations comparé à d'autres cas.
    Par exemple, si var est une constante et qu'on essaie de calculer 2 + var + 8, ce calcul sera fait à la compilation, et remplacé par son résultat dans le binaire compilé. À l'exécution ce calcul ne sera pas fait, parce que le résultat est déjà connu depuis la compilation.

    Tout ça pour dire ce que c'est qu'une constante au sens Java.


    Et malheureusement cela ne suit pas exactement les conventions de codage ALL_CAPS.
    Normalement on applique le ALL_CAPS sur les variables :
    • static final
    • initialisées avec une valeur prédictible (qui ne dépend pas de l'heure qu'il est ou d'un effet de bord d'une autre partie du programme.) Cela n'est pas vérifiable par le compilateur, c'est jugé par le programmeur.
    • immutables ou immutées. Cela n'est pas vérifiable par le compilateur, c'est jugé par le programmeur.


    Exemple : public static final MonthDay NOEL = MonthDay.of(12, 25); .

    Ces choses-là sont "grosso-modo des constantes pendant qu'on programme," mais pas forcément des constantes au sens Java.
    Notamment, une constante Java n'est pas tenue d'être static.
    Et aussi, une variable static final n'est pas forcément une constante Java.

    Du coup, c'est une habitude à prendre, mais il y a une certaine confusion avec les constantes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #24
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Je n'arrive pas à comprendre une chose au sujet de ces variables (prenons par exemple BORNE_MIN) :
    Il me semble bien que si je mets BORNE_MIN en static, cette constante devient une constante de classe, et toutes les instances pointerons vers la même constante BORNE_MIN et le fait de modifier cette même constante depuis n'importe quelle autre instance devrait avoir pour effet de modifier la valeur de cette constante pour toute les instances. En d'autres termes, les instances ne se partagerons qu'une seule constante.
    Or, ce qui est recherché est plutôt d'avoir la BORNE_MIN contenant une valeur différente pour chaque instance.

    Donc, d'après ce que je comprends, ces constantes ne devraient pas être static.

    D'ailleurs, lorsque je mets static final, eclipse me demande d'initialiser la constante dans la déclaration et me demande aussi de virer le mot clé final pour pouvoir l'initialiser dans le constructeur.


    De plus, je ne comprends pas non plus l'utilité de la méthode hashCode (à laquelle j'ai rajouté les booléens) car je n'arrive pas à entrer dans le code de la méthode Objects.hash() lors de debug. En fait elle retourne un résultat que je ne parviens pas à analyser ni à anticiper.

    Merci
    OS : LinuxMint 20

  5. #25
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Du coup, c'est une habitude à prendre, mais il y a une certaine confusion avec les constantes.


    Bon, je pense me rapprocher de la vérité et j'espère que cela deviendra une habitude !

    En fait, comme nous pouvons créer plusieurs instances de la classe Intervalle, il faut bien que les bornes de chaque instance puissent être personnalisées à la création de l'intervalle.
    Dans le sens de cette réflexion, je dirais donc que les bornes ne sont pas des constantes de classes, mais plutôt des constantes d'instances -> donc pas de static final mais du final simplement -> donc du lowerCase !

    Je vous remercie pour vos interventions qui transforment ce sujet en cours précis et d'un grand intérêt !

    Donc, j'ai de nouveau transformé cette classe Intervalle comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    import java.util.Arrays;
    import java.util.Objects;
     
    public class Intervalle {
    	//**************************DECLARATIONS
    	private final int borneMin;
    	private final int borneMax;
    	private final boolean isMinIncluded, isMaxIncluded;
     
    	//**************************CONSTRUCTEURS
    	//constructeur dont les bornes sont toutes incluses par défaut
    	public Intervalle(int borneMin, int borneMax){
    		this(borneMin, true, borneMax, true);
    	}
     
    	//constructeur permettant d'inclure ou exclure les deux bornes en même temps
    	public Intervalle(int borneMin, int borneMax, boolean isAllIncluded) {
    		this(borneMin, isAllIncluded, borneMax, isAllIncluded);
    	}
     
    	//constructeur permettant d'inclure ou exclure chaque borne séparément
    	public Intervalle(int borneMin, boolean isMinIncluded, int borneMax, boolean isMaxIncluded){
    		if(borneMin > borneMax){throw new IllegalArgumentException(" borneMin > borneMax ");}
     
    		this.borneMin = borneMin;
    		this.borneMax = borneMax;
    		this.isMinIncluded = isMinIncluded;
    		this.isMaxIncluded = isMaxIncluded;
    	}
     
    	//**************************METHODES
    	public int hashCode() {
    	    return Objects.hash(borneMin, borneMax, isMinIncluded, isMaxIncluded);
    	}
     
    	public boolean equals(Object obj) {
    	     if ( obj!=null && Intervalle.class.equals(obj.getClass()) ) {
    	         return equals((Intervalle)obj);
    	     }
    	     else { 
    	         return false;
    	     }
    	}
     
    	protected final boolean equals(Intervalle intervalle) {
    	      return intervalle.borneMin == this.borneMin && intervalle.borneMax == this.borneMax && intervalle.isMinIncluded == this.isMinIncluded && intervalle.isMaxIncluded == this.isMaxIncluded;
    	}
     
    	public int[] rangeTabInt(int[] tableau){
     
    		int[] tab;
     
    		//on définit la longueur du tableau selon si les bornes sont inclues ou exclues
    		if(isMinIncluded == true && isMaxIncluded == true){
    			tab = new int[(borneMax - borneMin)];
    			tab = Arrays.copyOfRange(tableau, borneMin, borneMax);
    		} else if (isMinIncluded == false && isMaxIncluded == false){
    			tab = new int[(borneMax - borneMin - 2)];
    			tab = Arrays.copyOfRange(tableau, borneMin + 1, borneMax - 1);
    		} else if (isMinIncluded == false && isMaxIncluded == true){
    			tab = new int[(borneMax - borneMin - 1)];
    			tab = Arrays.copyOfRange(tableau, borneMin + 1, borneMax);
    		} else if (isMinIncluded == true && isMaxIncluded == false){
    			tab = new int[(borneMax - borneMin - 1)];
    			tab = Arrays.copyOfRange(tableau, borneMin, borneMax - 1);
    		} else {
    			throw new IllegalArgumentException(" problème d'inclusion exclusion des bornes ");
    		}
     
    		return tab;
    	}
     
    	//**************************GETTERS
    	public int getBorneMin() {return borneMin;}
    	public int getBorneMax() {return borneMax;}
    	public boolean isMinIncluded() {return isMinIncluded;}
    	public boolean isMaxIncluded() {return isMaxIncluded;}
    }
    OS : LinuxMint 20

  6. #26
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par francky74 Voir le message
    [...]

    Donc, d'après ce que je comprends, ces constantes ne devraient pas être static.

    D'ailleurs, lorsque je mets static final, eclipse me demande d'initialiser la constante dans la déclaration et me demande aussi de virer le mot clé final pour pouvoir l'initialiser dans le constructeur.
    Une classe ne peut pas modifier la valeur d'une constante, c'est un peu le principe.

    Mais sinon, oui, en effet. Ces variables ne doivent absolument pas être static.
    Et donc elles ne doivent pas être en ALL_CAPS et plutôt s'appeler borneMin.

    Citation Envoyé par francky74 Voir le message
    De plus, je ne comprends pas non plus l'utilité de la méthode hashCode (à laquelle j'ai rajouté les booléens) car je n'arrive pas à entrer dans le code de la méthode Objects.hash() lors de debug. En fait elle retourne un résultat que je ne parviens pas à analyser ni à anticiper.
    Ben, comme le dit son nom, elle renvoie un code de hashing.

    La FAQ explique pourquoi et comment redéfinir la méthode hashCode()

    En résumé, ça travaille de pair avec la méthode equals() si un jour tu utilises tes intervalles dans un HashMap, HashSet ou similaire. Un appel à hashCode() fournit un nombre qui sera forcément le même pour deux intervalles égaux. Ce nombre permet de situer l'objet dans une table de hachage. Une fois cela fait, equals() permet de vérifier si ce qu'on trouve à cet endroit est bien un intervalle égal.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #27
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ouais, sauf que la notion de constante existe bel et bien en Java.
    Je ne dis pas le contraire, mais que cette désignation "constante", qu'on utilise dans le langage courant, porte à confusion. En particulier, si on dit que les constantes doivent par convention être en UPPER_CASE (ou ALL_CAPS comme tu dis), alors qu'une "final" non "static" ne doit pas l'être. La documentation parle d'ailleurs de "constant variable".
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Prix moyen dans un tableau croisé
    Par titi84 dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 15/04/2008, 16h41
  2. Extractiion d'intervalle de ligne d'un tableau
    Par blacksnake dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2007, 16h25
  3. Réponses: 6
    Dernier message: 07/06/2007, 20h23
  4. meilleur moyen pour parcourir un tableau
    Par deubelte dans le forum C++
    Réponses: 22
    Dernier message: 26/02/2007, 10h01
  5. [ImageMagick] Positionner des intervalles dans un tableau
    Par myomyo dans le forum Bibliothèques et frameworks
    Réponses: 98
    Dernier message: 22/05/2006, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo