Est l'appel de méthodes statiques via un objet “mauvaise forme”? Pourquoi?
Dans une récente question, quelqu'un a demandé à propos des méthodes statiques et l'une des réponses a déclaré qu'en général, il les appelle avec quelque chose comme:
MyClassName.myStaticMethod();
Les commentaires également déclaré que vous pourrait aussi l'appeler par l'intermédiaire d'un objet avec:
MyClassName myVar;
myVar.myStaticMethod();
mais qu'il était considéré comme une mauvaise forme.
Maintenant, il me semble que cela peut réellement faire de ma vie plus facile, donc je n'ai pas à vous inquiétez sur ce qui est statique ou non a.
Est il y a un problème avec l'appel de fonctions statiques par un objet? Évidemment, vous ne voulez pas créer une nouvelle marque d'objet juste de l'appeler:
Integer xyzzy;
int plugh = xyzzy.parseInt ("42", 10);
Mais, si vous avez déjà un objet du type désiré, est-il un problème dans à l'aide de il?
a de toute Évidence, je ne peux pas appeler un non-statique méthode:
MyClassName.myNonStaticMethod();
mais ce n'est pas la question que je veux parler ici.
- Voir cette SORTE de réponse pour l'info stackoverflow.com/questions/610458/...
- Quand j'ai lu le code et il y a un appel à une méthode, pour moi, c'est très pertinents pour être en mesure de dire tout de suite que cet appel ne peut pas lire ni modifier l'état de l'objet auquel elle appartient. Avec
MyClassName.myStaticMethod();
il n'y a même pas besoin de réfléchir une seconde. AvecmyVar.myStaticMethod();
vous avez besoin de voir le code de la méthode, et vous serez toujours dans le doute pour tous les appels. Bien sûr, plusieurs IDEs pourrait faire de cette information facile à retrouver (Javadoc info-bulles, la coloration syntaxique, etc.) mais je ne voudrais pas compter sur elle pour décider de la manière d'écrire le code.
Vous devez vous connecter pour publier un commentaire.
La mauvaise forme de commentaire vient des Conventions de Codage pour Java
Voir http://www.oracle.com/technetwork/java/codeconventions-137265.html#587
La raison, si vous pensez à ce sujet, est que la méthode, étant statique, ne pas appartiennent à un objet particulier. Parce qu'il appartient à la classe, pourquoi voudriez-vous pour élever un objet particulier à un tel statut spécial qu'il semble posséder une méthode?
Dans votre exemple, vous peut utiliser un entier par le biais de laquelle appeler
parseInt
(qui est, il est légal en Java), mais qui met le lecteur à se concentrer sur cet objet integer. Il peut être source de confusion pour les lecteurs, et, par conséquent, la direction est d'éviter ce style.Au sujet de cette rendant la vie plus facile pour vous le programmeur, tourner autour et demander ce qui rend la vie plus facile sur le lecteur? Il existe deux types de méthodes: les méthodes d'instance et statique. Quand vous voyez l'expression
C.m
et vous savezC
est une classe, vous savezm
doit être une méthode statique. Quand vous voyezx.m
(oùx
est un exemple) vous ne pouvez pas dire, mais ça ressemble à une méthode d'instance et donc, la plupart des gens se réserve cette syntaxe pour les méthodes d'instance seulement.À mon avis, la véritable cas d'utilisation qui est-ce qui est illisible quelque chose comme ça. À quoi correspond le code ci-dessous impression?
La réponse est qu'elle s'imprime "Super", parce que les méthodes statiques ne sont pas virtuels. Même si
instance
est-unSub
, le compilateur ne peut aller que sur le type de la variable qui estSuper
. Toutefois, en appelant la méthode viainstance
plutôt queSuper
, vous êtes subtilement ce qui implique qu'il sera virtuel.En fait, un développeur de la lecture de la
instance.method()
faudrait regarder la déclaration de la méthode (sa signature) pour connaître la méthode qui ce fait être appelé. Vous mentionnezMais, dans le contexte ci-dessus est en fait très important!
Je peux assez vous dire avec confiance que c'est une erreur pour la langue concepteurs de permettre dans le la première place. Rester à l'écart.
C'est une question de communication. Appel d'une méthode sur une instance implique vous agissez sur/avec ce cas particulier, pas sur/avec l'instance de la classe.
Il pourrait être super déroutant lorsque vous avez un objet qui hérite d'un autre objet, en substituant sa méthode statique. Surtout si vous faites référence à l'objet comme un type de sa classe ancêtre. Il ne serait pas évident quant à la méthode, vous êtes en cours d'exécution.