Je viens de recevoir un commentaire sur le fait que mon import statique de la méthode n'était pas une bonne idée. L'importation statique était une méthode d'une classe DA, qui a principalement des méthodes statiques. Donc, au milieu de la logique métier, j'avais une activité da qui semblait appartenir à la classe actuelle:
import static some.package.DA.*;
class BusinessObject {
void someMethod() {
....
save(this);
}
}
Le critique n'a pas voulu que je change le code et je ne l'ai pas fait, mais je suis plutôt d'accord avec lui. L'une des raisons invoquées pour ne pas importer statique était qu'il était déroutant où la méthode a été définie, ce n'était pas dans la classe actuelle et pas dans une superclasse, il était donc trop de temps pour identifier sa définition (le système de révision basé sur le Web n'a pas cliquable liens comme IDE :-) Je ne pense pas vraiment que cela compte, les importations statiques sont encore assez récentes et bientôt nous nous habituerons tous à les localiser.
Mais l'autre raison, celle avec laquelle je suis d'accord, est qu'un appel de méthode non qualifié semble appartenir à l'objet courant et ne doit pas sauter de contextes. Mais si cela appartenait vraiment, il serait logique d'étendre cette super classe.
Alors, quand est- il judicieux d'utiliser des méthodes d'importation statiques? Quand l'avez-vous fait? Avez-vous aimé / avez-vous aimé l'apparence des appels non qualifiés?
EDIT: L'opinion populaire semble être que les méthodes d'importation statique si personne ne va les confondre avec les méthodes de la classe actuelle. Par exemple, les méthodes de java.lang.Math et java.awt.Color. Mais si abs et getAlpha ne sont pas ambigus, je ne vois pas pourquoi readEmployee l'est. Comme dans beaucoup de choix de programmation, je pense que c'est aussi une question de préférence personnelle.
Merci pour votre réponse les gars, je ferme la question.
la source
import static
, la fonctionnalité eststatic import
Réponses:
Ceci est tiré du guide de Sun lors de la sortie de la fonctionnalité (souligné dans l'original):
( https://docs.oracle.com/javase/8/docs/technotes/guides/language/static-import.html )
Il y a deux parties que je veux appeler spécifiquement:
extend some.package.DA
? Si tel est le cas, les importations statiques peuvent être un moyen plus propre de gérer cela. Si vous n'auriez jamais rêvé d'étendresome.package.DA
, c'est probablement une mauvaise utilisation des importations statiques. Ne l'utilisez pas uniquement pour enregistrer quelques caractères lors de la saisie.import static some.package.DA.save
au lieu deDA.*
. Cela permettra de trouver beaucoup plus facilement d'où provient cette méthode importée.Personnellement, j'ai utilisé cette fonctionnalité de langage très rarement, et presque toujours uniquement avec des constantes ou des énumérations, jamais avec des méthodes. Le compromis, pour moi, n'en vaut presque jamais la peine.
la source
Une autre utilisation raisonnable des importations statiques est avec JUnit 4. Dans les versions antérieures des méthodes JUnit comme
assertEquals
etfail
étaient héritées depuis l'extension de la classe de testjunit.framework.TestCase
.Dans JUnit 4, les classes de test n'ont plus besoin d'être étendues
TestCase
et peuvent à la place utiliser des annotations. Vous pouvez ensuite importer statiquement les méthodes d'assert depuisorg.junit.Assert
:JUnit documents utilisant cette façon.
la source
Effective Java, Second Edition , à la fin de l' article 19, indique que vous pouvez utiliser des importations statiques si vous vous retrouvez à utiliser fortement les constantes d'une classe utilitaire. Je pense que ce principe s'appliquerait aux importations statiques de constantes et de méthodes.
Cela présente des avantages et des inconvénients. Cela rend le code un peu plus lisible au détriment de la perte d'informations immédiates sur l'endroit où la méthode est définie. Cependant, un bon IDE vous permettra d'accéder à la définition, donc ce n'est pas vraiment un problème.
Vous devez toujours l'utiliser avec parcimonie, et seulement si vous vous retrouvez à utiliser des éléments du fichier importé de nombreuses fois.
Edit: mis à jour pour être plus spécifique aux méthodes, car c'est ce à quoi cette question fait référence. Le principe s'applique indépendamment de ce qui est importé (constantes ou méthodes).
la source
UtilityClassWithFrequentlyUsedMethods
besoin d'être raccourci.double myPI = Math.PI;
et puis je peux continuer à me référer aumyPI
lieu deMath.PI
.Je conviens qu'ils peuvent être problématiques du point de vue de la lisibilité et doivent être utilisés avec parcimonie. Mais lorsqu'ils utilisent une méthode statique commune, ils peuvent en fait augmenter la lisibilité. Par exemple, dans une classe de test JUnit, les méthodes telles que leur origine
assertEquals
sont évidentes. De même pour les méthodes dejava.lang.Math
.la source
sin x cos y + cos x sin y
. En Java devient:Math.sin(x) * Math.cos(y) + Math.cos(x) * Math.sin(y)
. Horrible à lire.using
tellement manqué les directives en C ++: elles peuvent être locales .Je pense que l'importation statique est vraiment utile pour supprimer les noms de classe redondants lors de l'utilisation de classes utils comme
Arrays
etAssertions
.Je ne sais pas pourquoi, mais Ross a sauté la dernière phrase qui mentionne cela dans la documentation à laquelle il fait référence .
Fondamentalement copié de ce blog: https://medium.com/alphadev-oughtts/static-imports-are-great-but-underused-e805ba9b279f
Donc par exemple:
Assertions dans les tests
C'est le cas le plus évident sur lequel je pense que nous sommes tous d'accord
Classes et énumérations d'utils
Le nom de la classe peut être supprimé dans de nombreux cas lors de l'utilisation de classes utils rendant le code plus facile à lire
Le package java.time a quelques cas où il devrait être utilisé
Exemple de non-utilisation
la source
Je l'utilise beaucoup pour la couleur.
Il est très peu probable que les couleurs soient confondues avec autre chose.
la source
Je recommande l'utilisation d' importation statique lors de l' utilisation d' OpenGL avec Java, qui est un cas d' utilisation de tomber dans la « utilisation intensive des constantes d'une classe utilitaire » catégorie
Considérez cela
vous permet de porter le code C d'origine et d'écrire quelque chose de lisible tel que:
au lieu de cette laideur répandue commune:
la source
Les importations statiques sont la seule «nouvelle» fonctionnalité de Java que je n'ai jamais utilisée et que je n'ai pas l'intention d'utiliser, à cause des problèmes que vous venez de mentionner.
la source
J'utilise 'import static java.lang.Math. *' Lors du portage de code mathématique lourd de C / C ++ vers java. Les méthodes mathématiques mappent de 1 à 1 et facilitent la différence du code porté sans la qualification de nom de classe.
la source
J'ai trouvé cela très pratique lors de l'utilisation des classes Utility.
Par exemple, au lieu d'utiliser:
if(CollectionUtils.isNotEmpty(col))
Je peux à la place:
Quelle IMO augmente la lisibilité du code lorsque j'utilise cet utilitaire plusieurs fois dans mon code.
la source
À propos des tests unitaires: la plupart des gens utilisent des importations statiques pour les différentes méthodes statiques fournies par les frameworks moqueurs , comme
when()
ouverify()
.Et bien sûr, lorsque vous utilisez la seule et unique
assertThat()
assertion, vous devez l'utiliser pour importer statiquement les correspondeurs hamcrest requis, comme dans:la source
Ils sont utiles pour réduire le verbiage, en particulier dans les cas où de nombreuses méthodes importées sont appelées et où la distinction entre les méthodes locales et importées est claire.
Un exemple: code qui implique plusieurs références à java.lang.Math
Autre: une classe de générateur XML où l'ajout du nom de classe à chaque référence masquerait la structure en cours de construction
la source
Je pense que les importations statiques sont parfaites pour NLS dans le style gettext.
Cela marque à la fois la chaîne comme une chaîne qui doit être extraite et fournit un moyen simple et propre de remplacer la chaîne par sa traduction.
la source
L'importation statique IMO est une fonctionnalité assez intéressante. Il est absolument vrai qu'une forte dépendance à l'importation statique rend le code illisible et difficile à comprendre à quelle classe appartient une méthode ou un attribut statique. Cependant, d'après mon expérience, cela devient une fonctionnalité utilisable, en particulier lors de la conception de
Util
classes qui fournissent des méthodes et des attributs statiques. L'ambiguïté qui surgit à chaque fois qu'une importation statique peut être contournée en établissant des normes de code. D'après mon expérience au sein d'une entreprise, cette approche est acceptable et rend le code plus propre et facile à comprendre. De préférence, j'insère le_
caractère devant les méthodes statiques et les attributs statiques (en quelque sorte adoptés à partir de C). Apparemment, cette approche viole les normes de dénomination de Java, mais elle clarifie le code. Par exemple, si nous avons une classe AngleUtils:Dans ce cas, l'importation statique apporte de la clarté et la structure du code me semble plus élégante:
Tout de suite, quelqu'un peut dire à quelle méthode ou quel attribut provient une importation statique et il cache les informations de la classe à laquelle il appartient. Je ne suggère pas d'utiliser l'importation statique pour les classes qui font partie intégrante d'un module et fournissent des méthodes statiques et non statiques car dans ce cas, il est important de savoir quelle classe fournit certaines fonctionnalités statiques.
la source
H_
pour les importations d'uneHelper
classe d'utilité que j'ai, ouC_
pourCommon
, ouU_
pourUtility
. Alternativement, j'ai envisagé d'utiliser un ou deux noms de classes de caractères pour ces classes largement utilisées, mais je craignais que ceux-ci puissent parfois entrer en conflit avec les noms locaux - avoir du code hérité avec des noms de méthode en majuscules.Vous devez les utiliser lorsque:
switch
instruction avec des valeurs d'énumérationla source
Je les utilise quand je peux. J'ai configuré IntelliJ pour me rappeler si j'oublie. Je pense que cela semble beaucoup plus propre qu'un nom de package complet.
la source