CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Java] Problème variable final

fcbneymar
fcbneymar
Niveau 7
21 décembre 2013 à 23:18:30

Bonsoir, j'ai un petit problème de variable,
mon ide me signale "variable pause is accessed from within inner class; needs to be declared final ", je ne trouve pas la solution.

boolean pause = false;
playPause = (Button) findViewById(R.id.play);

playPause.setOnClickListener(new View.OnClickListener() {
   public void onClick(View view) {
        if (pause) {
            pause();
        }else{
            play();
        }
        pause = !pause;
   }
});

Par avance merci :)

String[]args
String[]args
Niveau 23
22 décembre 2013 à 01:46:02

La solution c'est " needs to be declared final ". :noel:

fcbneymar
fcbneymar
Niveau 7
22 décembre 2013 à 11:06:38

C'est ce que j'ai fait mais je ne peux pas modifié ma variable "cannot assign a value to final variable"

Bunyan
Bunyan
Niveau 17
22 décembre 2013 à 11:36:17

Problème de portée de variables (marrant comme ça revient souvent, ce souci).

Ici, tu as 2 classes : ta classe englobante et ton listener en classe anonyme. "pause" est locale à ta méthode, donc seule cette méthode peut y avoir accès, dès sa définition. Le listener étant une autre classe, le bout de code est peut-être "en-dessous", mais c'est une bien une classe différente, elle n'a donc aucun accès à "pause".

En la rendant "final", tu augmentes sa portée en disant "ma variable, là elle ne changera pas, tu peux donc la passer, il n'y aura pas de problème de synchr ou de concurrence".

Clairement, ce n'est pas ce que tu veux, et "pause" avec sa déclaration courante ne fera pas non plus ce que tu veux. Pour ce que je comprends de son utilité, il faut au minimum la déclarer en variable d'instance.

Je te suggères de bien comprendre les notions de programmation événementielle, et de te renseigner sur les portées des variables. Le second est ton problème, le premier pourra t'être utile pour toute création d'interface.

fcbneymar
fcbneymar
Niveau 7
22 décembre 2013 à 13:06:41

Merci pour ton aide et ta solution, je vais regarder de plus près la programmation événementielle :) .

Schiffer
Schiffer
Niveau 10
22 décembre 2013 à 16:22:00

mets la variable pause comme un attribut

jack37
jack37
Niveau 10
24 décembre 2013 à 10:43:54

Tu peux aussi utiliser le binding de jgoodies (après tu pourras plus t'en passer :non: )

Bunyan
Bunyan
Niveau 17
24 décembre 2013 à 13:16:04

JGoodies n'est pas pour Android, et c'est la plate-forme qu'il cible.

De plus, je tiens à souligner que fcbneymar fait une erreur de débutant (pas de mal à ça ;) ) sur une notion commune à la plupart des langages de programmation, à savoir la portée des variables. Sortir un framework dans ce contexte est particulièrement déplacé.

jack37
jack37
Niveau 10
24 décembre 2013 à 14:53:08

Ah oui, j'avais pas vu, :desole:

jack37
jack37
Niveau 10
24 décembre 2013 à 14:56:24

Bah je me pose pas trop de question, c'est un problème sur lequel on tombe toutes les 10 minutes en java et comme nous on utilise jgoodies, bah la question ne se pose même plus..

Après de là à dire que c'est déplacé, je ne suis pas d'accord, il faudrait être fou pour programmer en java sans jgoodies, mais bon, certains semblent aimer se compliquer la vie alors :)

Bunyan
Bunyan
Niveau 17
24 décembre 2013 à 16:50:28

Au lieu de simplement balancer le mot, pourrais-tu expliciter ce que ça te change ?

J'utilise Java pour faire uniquement de l'Android et du JEE. De ce que j'ai compris de JGoodies, ce framework permet de faire de jolies applications basées sur Swing, ce qui correspond à un périmètre assez restreint des applications utilisant Java.
En sus de ça, un poil de Grails (donc Groovy) pour des sites webs. Je ne vois pas l'intérêt de JGoodies pour chacun de ces projets, qui se fait pourtant en Java.

Et si, je persiste et signe, c'est totalement déplacé de proposer un framework pour combler une lacune basique de programmation. Je rappel de nouveau que le problème ici est la portée des variables. Proposer un framework pour remplacer une connaissance tout à fait basique est suicidaire.

De plus, je rappel et signal qu'il ne faut pas tomber dans la "framework-ite aigüe", maladie assez grave consistant à toujours prendre un framework sans se poser la question si c'est faisable à la main, accouchant de superbes usines à gaz possédant un nombre ahurissant de dépendances, la plupart étant utilisées pour une seule fonctionnalité/méthode, soit moins de 10%.

jack37
jack37
Niveau 10
29 décembre 2013 à 12:44:30

Alors déjà jgoodies est loin d'être une usine a gaz... Après dans l'informatique fait savoir rester humble (une très grande qualité que beaucoup oublie au fur a mesure que leur chevilles enfle)

Bref le binding de jgoodies ça change la vie. Après je vais pas faire un cours sur ce qu'est jgoodies, je dis juste qui faut l'essayer avant de sortir des bêtises. Je persiste et signe également :ok:

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
29 décembre 2013 à 14:02:42

Je plussoie complètement Bunyan sur ses deux derniers paragraphes. Je ne connais pas JGoodies mais normalement on utilise un framework si on en a besoin, pas juste pour deux-trois fonctionnalités car ça c'est complètement contre-productif contrairement à ce que tu soutiens. Et si en plus les fonctionnalités que tu utilises sont dues au fait que tu maîtrises mal Java de base, c'est encore pire.
Donc je ne connais pas JGoodies je le redis, mais dans ce cas précis c'est pas la bonne solution ni même une solution acceptable.

jack37
jack37
Niveau 10
30 décembre 2013 à 02:37:27

De toute façon, ce n'est pas utilisable pour android, il n'y a donc pas à tergiverser. Ce que je voulais juste mettre en avant c'est la partie binding de jgoodies qui est une merveille et ce n'est en tout ca pas un framework orienté web.. Bref faut l'essayer pour savoir de quoi on parle, sans ça, ça sert à rien :pf: Ca partie formulaire permer de faire des interface ui sans trop se prendre la tête, alors oui ce n'est pas obligatoire pour faire des applications java, mais comme je l'ai déjà dit, si les gens aiment se compliquer la vie :ok:

Bunyan
Bunyan
Niveau 17
31 décembre 2013 à 03:20:49

Je tiens à insister sur un point : je ne reproche absolument pas de n'avoir pas vu que c'était pour de l'Android. Ce n'est pas précisé, et il faut en avoir fait pour reconnaître le "findViewById".

Donc en résumé : "Utilise JGoodies, ça ne correspond absolument pas à ton besoin et ne réponds pas à ta question, mais ce framework est génial !".

Note que JGoodies n'a pas été critiqué. Il est peut-être totalement génial, je n'en sais rien et me garderai bien de donner un avis uniquement sur les snippets montrés sur le site.

Si tu veux en faire la promotion, libre à toi, mais fais-le où ça pourrait avoir un intérêt, et fais-le bien, ne te content pas de dire "c'est trop bien". A titre personnel, je te remercie de me l'avoir fait découvrir (l'écosystème Java est tellement vaste), mais la manière dont tu le vends/l'amène/le promeut tendrai à faire fuir.

Tu restes sur l'argument "si les gens aiment se compliquer la vie", je te repose donc exactement la même question : "pourrais-tu expliciter ce que ça te change ?"

jack37
jack37
Niveau 10
31 décembre 2013 à 12:20:22

Un petit pdf explicatif de ce qu'est le databinding :

http://www.jgoodies.com/download/presentations/binding.pdf

Admettons que tu aies une fenêtre qui ne gère qu'un objet de type de Personne (nom, prénom, age, ...). Et tu veux activer un bouton uniquement si l'age de la personne sur cette même fenêtre, si l'age de la personne >= 18.

Et bien tu feras :

getPresentationModel.getBean().addPropertyChangeLi
stener(Personne.AGE,
new propertyChangeListener() {
// if e.getValue() >= 18, alors activer bouton
});

Car dans le getter/setter de ton objet Personne, tu auras préalablement poser un firepropertychange (La méthode firePropertyChange() permet d'informer tous les composants enregistrés du changement de la valeur de la propriété).

C'est quand même plus simple que d'attendre que l'utilisateur quitte le champs Age pour connaitre la valeure saisie, ici on est directement notifié dès que la valeur change.

Laquelle des deux méthode prèfères-tu ?

getPresentationModel.getBean().addPropertyChangeLi
stener(Personne.AGE,
new propertyChangeListener() {

public void propertyChange(PropertyChangeEvent e) {
// if e.getValue() >= 18, alors activer bouton
}

});

ou alors:

getChampsAge.addFocusListener(new FocusListener() {

@Override
public void focusGained(FocusEvent e) {}

@Override
public void focusLost(FocusEvent e) {
// if getPersonne.getAge() >= 18, alors activer bouton
}

});

jack37
jack37
Niveau 10
31 décembre 2013 à 12:27:54

Et par rapport au message initial, j'ai mis jgoodies sur le tapis (je le repete, je n'utilise que ca), tu peux facilement faire

final monPm = ....;

puis dans ton listener :

monPm.getBean().setAge(x)

plus de limitation au niveau de la portee de la variable, puisque c'est un modele :ok:

dark_drow
dark_drow
Niveau 15
31 décembre 2013 à 13:34:15

Le framework est surement bien (comme tout le monde te le dit) mais t'a pas l'air de comprendre que le problème de l'OP c'est la compréhension de ce qui se passe dans son code.

En utilisant un framework qui résout magiquement les problèmes (assez simple en l'occurrence) ça donne des programmeurs un peu merdique à mon avis. Surtout que pour bien utiliser un framework il faut comprendre un minimum ce qu'il fait en interne, chose qui - à mon avis - est larrrgement plus complexe qu'un problème de portée.

Personnellement c'est probable que j'utilise ce genre de framework pour mes prochains dev, mais seulement parce que je maîtrise suffisamment swing et que j'ai pas envie de taper 500 lignes de code verbeux pour faire du binding.

Bunyan
Bunyan
Niveau 17
31 décembre 2013 à 13:37:59

Merci de l'explication.
De ce que je comprends, il fait un pattern Observer automatiquement avec liaison des propriétés. Ca pourrait effectivement être intéressant, si les contrôles sont eux aussi possibles (restriction de tailles, types...).
A titre personnel, je déteste cordialement les accesseurs faisant plus qu'un get/set.

Déjà eu de très mauvaises surprises avec des getter faisant du lazy loading et des appels réseaux à tire-larigot...

Pour ton exemple, je ferai plutôt un TextListener personnellement, sauf si la notion de focus est strictement obligatoire (ce que client veut absolument contre vents et marées...).

"plus de limitation au niveau de la portee de la variable, puisque c'est un modele :ok: "
Tout a fait... mais quand on ne connait pas la notion de "portée", on contourne le problème sans véritablement l'adresser puisque la notion n'est pas acquise ni comprise, et que celle-ci fait partie de la base. C'est un bon moyen, à mon avis, de se retrouver confronter au même problème peu de temps après et de systématiquement faire la même implémentation, qui ne sera sans doute pas adaptée (sauf chance).

jack37
jack37
Niveau 10
31 décembre 2013 à 14:21:03

De ce que je comprends, il fait un pattern Observer automatiquement avec liaison des propriétés. Ca pourrait effectivement être intéressant, si les contrôles sont eux aussi possibles (restriction de tailles, types...).

-> Oui et ils le sont! Jgoodies permet aussi la validation des données (mettre un champs en erreur, ne pas sauver l'enregistrement tant qu'il est en erreur, afficher un message d'erreur ...)

Pour faire des choses dans ce gout là par exemple:

http://www.java2s.com/Code/Java/Swing-Components/ValidationHowtoExample.htm

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment