33 votes

Java : Quand rendre les méthodes statiques ou d'instance

J'ai un Gene qui garde la trace des gènes. Gene dispose d'une méthode pour calculer la distance entre deux gènes. Y a-t-il des raisons de la rendre statique ?

Lequel est le meilleur ?

public static int geneDistance(Gene g0, Gene g1)

o

public int geneDistance(Gene other)

Arguments pour ou contre le fait de le rendre statique ? Je comprends ce que cela signifie pour un membre d'être statique, je suis juste intéressé par ses implications pour une propreté/efficacité/etc maximale.

Je répète le même schéma pour retourner des versions rognées de deux gènes, trouver des correspondances entre gènes, trouver des correspondances entre animaux (qui contiennent des collections de gènes), etc.

21voto

DigitalRoss Points 80400

Instance, non statique


Dans ce cas, je pense que le deuxième choix est nettement meilleur. Si vous y réfléchissez, n'importe quelle méthode pourrait être implémentée comme statique si vous êtes prêt à lui passer l'objet, ceci seulement parece est un cas particulier car l'autre paramètre est également une instance.

Par conséquent, notre recherche de symétrie et d'abstraction est légèrement offensée par le fait de devoir choisir entre les deux objets d'instance pour l'opérateur point. Mais si l'on regarde .method comme . puis opérateur ce n'est pas vraiment un problème.

De plus, le seul moyen de faire un chaînage de style fonctionnel est d'utiliser un attribut, c'est-à-dire une méthode d'instance. Vous voulez probablement thing.up.down.parent.next.distance(x) pour travailler.

14voto

Charles Salvia Points 28661

Lorsque vous rendez une méthode statique, cela signifie que la méthode peut être appelée sans une instance de la classe. Cela signifie également que la méthode ne peut pas accéder aux variables d'instance à moins qu'on ne lui transmette une référence à un objet.

Parfois, il est judicieux de rendre une méthode statique, car la méthode est associée à la classe, mais pas à une instance particulière de la classe. Par exemple, toutes les méthodes parseX, telles que Integer.parseInt(String s ). Cela permet de convertir un String à un int mais n'a rien à voir avec une instance particulière d'un système d'alerte précoce. Integer objet.

Si, par contre, une méthode doit renvoyer des données qui sont uniques à une instance particulière d'un objet (comme la plupart des méthodes getter et setter), alors elle ne peut pas être statique.

8voto

ammoQ Points 17866

IMO, il n'y a pas de "meilleur" absolu, mais public int geneDistance(Gene other) est stylistiquement plus proche d'autres méthodes en Java (par exemple Object.equals, Comparable.compareTo), donc je choisirais cette voie.

8voto

Pascal Thivent Points 295221

Je préfère la deuxième forme, c'est-à-dire la méthode d'instance pour les raisons suivantes :

  1. Les méthodes statiques rendent les tests difficiles car elles ne peuvent pas être remplacées,
  2. Les méthodes statiques sont plus orientées vers les procédures (et donc moins vers les objets).

IMO, les méthodes statiques sont ok pour les classes utilitaires (comme StringUtils) mais je préfère ne pas en abuser.

7voto

divesh premdeep Points 395

Ma reformulation de la réponse de Charle :

Si la méthode en question a l'intention d'utiliser l'état du sous-jacent objet de quelque manière que ce soit, faites-en une méthode d'instance. Sinon, faites-en une méthode statique.

Ce qui dépend de la façon dont la classe de l'objet est conçue.

Dans votre cas, alphazero, probablement la int geneDistance(Gène g0, Gène g1) n'est pas dépendent vraiment de l'état de la Gene l'instance sur laquelle il est appelé. Je ferais en sorte que cette méthode soit statique. Et je la mettrais dans une classe utilitaire comme GeneUtils .

Bien sûr, il peut y avoir d'autres aspects de votre problème que je ne connais pas, mais c'est la règle générale que j'utilise.

P.S. -> La raison pour laquelle je ne mettrais pas la méthode dans le fichier Gene La raison en est qu'un gène ne devrait pas être responsable du calcul de sa distance par rapport à un autre gène ;-)

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