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 : modifier class sans setters

Cainzer
Cainzer
Niveau 10
14 décembre 2015 à 11:11:00

Salut,

En java, j'aimerais savoir comment modifier un objet, une classe sans passer par des setters.
Par exemple si je veux changer le nom de mon Personnage dans ma classe personnage je fais un truc du genre :

public void setNom(String nom) {
  this.nom = nom;
}

Le problème c'est que mon prof ne veut plus qu'on fasse ça. Il a parlé d'une classe "Evolve" à implémenter, mais j'ai beau chercher sur google je ne vois pas du tout à quoi ça renvoie.

Pourriez-vous éclairer ma lanterne et me dire quelle est la bonne pratique pour modifier proprement les données d'un objet ?

Merci d'avance.

Candystand
Candystand
Niveau 10
14 décembre 2015 à 11:42:52

Tu pourrais tout simplement mettre ta variable nom en public

Bunyan
Bunyan
Niveau 17
14 décembre 2015 à 11:49:18

C'est pas franchement une bonne pratique de tout foutre en public Candystand (encapsulation et responsabilités des objets + contrôle et maintenance facilités via l'utilisation de setter).
De plus, cela ne répond pas à la problématique de Cainzer, son professeur souhaitant manifestement un changement d'architecture.

Bon... Cainzer, sans avoir aucun contexte ni aucune information, ça va être très dur de t'aider.
J'imagine que vous avez un logiciel type "jeu de la vie" ou "pokémon" et que ce que ton professeur souhaite, c'est que la créature sache elle-même quelle est son évolution via l'utilisation d'une interface "Evolve".
Si tu pouvais donner du contexte, ce sera très très très très appréciés.

La bonne pratique est de passer par des setter (ou updater, dans le cas de changements plus complexes).

TintinMage
TintinMage
Niveau 10
14 décembre 2015 à 13:56:30

Tu peux faire avec la réflexivité mais je pense pas que c'est ce que veux ton prof
https://image.noelshack.com/fichiers/2015/51/1450097218-capture.png

Cainzer
Cainzer
Niveau 10
14 décembre 2015 à 20:43:47

Bunyan, bravo c'est exactement ça ! Un logiciel type pokemon !
En gros, un pokemon qui a un nom, une ou des énergies, des points de vie...
Ce TP est juste un entrainement, il faut pouvoir créer plusieurs pokemons, les afficher et les modifier si on a envie.
A vrai dire je n'ai aucun mal à faire tout ça. Simplement : interdiction d'utiliser les setters. Là ça m'embête, comment modifier le nom de mon pokemon si j'ai envie ?
Donc si tu pouvais me dire la démarche ça serait sympa.

Tintinmage, merci ! Je sais pas s'il veut ça, mais je sais pas ce qu'il veut que je fasse en fait. Par contre ça me semble compliqué niveau démarche. J'ai l'impression qu'on fait du forcing avec cette méthode : setAccessible(true)

TintinMage
TintinMage
Niveau 10
14 décembre 2015 à 21:03:41

Les attributs sont obligatoirement private ?
Si non c'est que tu peux les mettre protected et ainsi pouvoir y accéder avec les class qui l'implémentent (cf Evolve)

FrontPage2003
FrontPage2003
Niveau 7
14 décembre 2015 à 22:32:41

Je pense que ton prof veut vous faire utiliser l'héritage et la visibilité protected (auquel cas tu pourras accéder à l'attribut comme on le ferait au sein de la classe mère avec nomAttribut ou this.nomAttribut).

Je ne pense pas qu'il veuille vous faire utiliser l'api de réflexivité qui est mauvaise en perf et à utiliser avec précaution (généralement dans les TU d'ailleurs, ou au sein d'un framework... rarement dans le cadre d'un projet).

Sinon pour les getters/setters, ceux-ci n'ont pas forcément besoin d'être écrits. Ils peuvent être générés (par eclipse) ou via annotations (https://projectlombok.org/).

Cainzer
Cainzer
Niveau 10
16 décembre 2015 à 10:38:18

Le 14 décembre 2015 à 21:03:41 Tintinmage a écrit :
Les attributs sont obligatoirement private ?
Si non c'est que tu peux les mettre protected et ainsi pouvoir y accéder avec les class qui l'implémentent (cf Evolve)

Oui obligatoirement en privée. Donc je peux mettre protected.

Le 14 décembre 2015 à 21:25:47 whiteapplex a écrit :
Le pokémon peut connaitre le nom de ses évolutions, donc il suffit d'avoir un entier "stade d'évolution" qui commence à 0, un tableau avec le nom des évolutions. Quand tu appelles la méthode Evolve, tu incrémentes le stade d'évolution et tu renommes le pokémon directement via cette méthode en faisant correspondre le stade d'évolution et le tableau des noms d'évolution, de cette façon les seuls noms que pourra prendre un pokémon sont les noms de ses évolutions, et si tu fais les bons tests dans Evolve pour la montée de niveau, le nom du pokémon est "sécurisé" et un utilisateur de la classe ne peut pas transformer un Magicarpe en Mew.
Si tu veux renommer un pokémon avec un nom personnalisé par contre il faudra forcément faire un setters je crois, mais bon dans le jeu les pokémons ont les deux informations: le nom donné par le dresseur et le nom de leur espèce, on parlait du deuxième je crois.

Ok donc pour un nom personnalisé il faut forcément un setter. Ça m'embête parce qu'il a dit qu'il fallait même pas que les setters apparaissent. Mais si je tape le nom du pokemon, que je le crée et que je me rends compte que j'ai fait une faute de frappe il faut bien pouvoir le modifier sans susciter une évolution.
Merci pour tes conseils pour faire évoluer le pokemon ils me seront utiles.

Le 14 décembre 2015 à 22:32:41 FrontPage2003 a écrit :
Je pense que ton prof veut vous faire utiliser l'héritage et la visibilité protected (auquel cas tu pourras accéder à l'attribut comme on le ferait au sein de la classe mère avec nomAttribut ou this.nomAttribut).

Je ne pense pas qu'il veuille vous faire utiliser l'api de réflexivité qui est mauvaise en perf et à utiliser avec précaution (généralement dans les TU d'ailleurs, ou au sein d'un framework... rarement dans le cadre d'un projet).

Sinon pour les getters/setters, ceux-ci n'ont pas forcément besoin d'être écrits. Ils peuvent être générés (par eclipse) ou via annotations (https://projectlombok.org/).

D'accord merci. Par contre générer automatiquement je connaissais.

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