Question

J'ai récemment commencé à faire des simples jeux 2D, et suis tombé sur un dilemme - à l'utilisation ou de ne pas utiliser getter et setter pour les positions x et y d'un objet. Il regarderait plus clair si je ne voudrais pas utiliser des méthodes, mais accéder aux variables directement à la place, et aussi, de nombreux appels de méthode sur l'objet serait nui au rendement. En outre obtenir et de définir la position à peu près reste simple, donc il n'y a vraiment pas besoin d'encapsulation ici? Ou devrions-nous toujours coller à la convention des méthodes getter et setter à tout moment?

Était-ce utile?

La solution

Il est toujours préférable de coller à la convention. De plus, le JIT va simplifier les opérations afin d'accéder directement au champ au lieu de passer par toute la pile de méthodes.

Il est appelé méthode inline.


  

La version Java 2 de la machine virtuelle Java inline automatiquement des méthodes simples lors de l'exécution. Dans un non optimisé Java VM, chaque fois qu'une nouvelle méthode est appelée, un nouveau cadre de pile est créé. La création d'un nouveau cadre de pile a besoin de ressources supplémentaires, ainsi que certains remappage de la pile, le résultat final est que la création de nouveaux cadres de pile entraîne une petite surcharge.

     

Méthode inline augmente les performances en réduisant le nombre de méthode appelle vos marques de programme. Le code inline Java VM inline méthodes constantes de retour ou des champs internes uniquement accès .


Ressources:

Sur le même sujet:

Autres conseils

Vous ne devriez pas avoir getter et setter, ni vous devez faire les attributs du public.

Au lieu de cela vous avez des méthodes telles que .updatePosition (), .draw (), .moveTo (), .collideWith (), etc afin que vous ne serez jamais besoin d'obtenir ou les valeurs réglées directement à partir de l'extérieur.

Il y a quelques rares cas où vous voulez vraiment obtenir / valeurs réglées directement à partir de l'extérieur, mais ces cas sont rares et que pas plus souvent indiquent une mauvaise conception (bien qu'il y ait sont des utilisations valides) .

J'utiliser getters / setters. Pourquoi?

  1. Encapsulation est touche . Peut-être que vous allez changer la façon dont vous stockez des emplacements plus loin (par exemple cartésien polaire?). Getters / setters vous permettra d'effectuer des conversions appropriées.
  2. Setters permettra à votre objet de faire respecter les conditions (par exemple est x> 0 et <10?)

Une autre raison (mais peut-être pas adapté à vos besoins actuellement) est que de nombreux frameworks Java utilisent la réflexion et des classes pour Introspect setters / getters dans le format setX / getX conventionnel. En mettant en œuvre ces méthodes, vos classes sont immédiatement disponibles pour être réutilisés dans une grande variété de cadres.

Ne vous inquiétez pas sur les performances jusqu'à ce qu'il soit une préoccupation connue. L'optimisation prématurée vous causer trop de maux de tête.

nous Stendhal getters / setters utiliser. Nous avons environ 60 000 objets mobiles qui sont traités à chaque tour. D'après mon expérience dans les méthodes simples de Stendhal ne pas avoir d'impact sur le rendement mesurable du tout. Nous avons fait un peu de calme profilage pour trouver divers problèmes, et extrêmement amélioration de la performance dans les deux dernières mois.

Le principal goulot de la bouteille que nous avons est pathfinding (en particulier de détection de collision avec d'autres objets mobiles). Il y avait eu problème comme la création d'un nouvel objet paire sur chaque contrôle de collision possible, ou la création d'un nouvel objet Rectangle chaque fois a été demandé à une entité pour sa position et la taille.

Ces choses sont très facilement repérables dans un Profiler (Voir serveur de profils côté boucle de jeu en java sur gamedev).

D'autres causes courantes de retard en dehors de la partie logique de boucle de jeu est un accès de communication client / serveur et base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top