37 votes

Un moyen simple de créer des importations statiques pour les constantes dans le code existant?

Si j'ai un constant BAR Foo, que je vais utiliser dans une classe C je vais avoir à écrire

Object o = Foo.BAR + "...";

que je peux utiliser Ctrl-Maj-M dans Eclipse pour créer une statique à l'importation comme:

import static Foo.BAR;

Object o = BAR + "....";

Je suis actuel de la mise à jour du code legacy avec litéralement des milliers de ces je voudrais convertir à l'électricité statique des importations. Ctrl-Shift-O / Organiser les importations ne pas le faire. Est-il un truc que j'ai manqué?


EDIT: en Fait, ce que je préfère est une façon de dire Eclipse que je veux avoir Ctrl-Maj-M opérer sa magie sur TOUTES les instances de cette classe particulière au lieu de simplement le seul exemple que j'ai le curseur placé à l'. (C'est l'héritage de code de ce fait AMÉLIORE la lisibilité :) )

11voto

cletus Points 276888

Une note d'avertissement: une utilisation excessive de la statique des importations pouvez réellement faire de votre code moins lisible (à mon humble avis), en particulier si le nom de constante n'a pas d'indiquer clairement la classe ou enum à partir de laquelle il appartient. Vous pouvez également obtenir les noms des constantes de différentes classes/les énumérations que son semblable ou même avoir le même nom.

Donc, ce que vous êtes en forçant le lecteur à faire c'est espérer son IDE va lui dire la classe (via, par exemple, un outil de pointe) ou qu'ils ont à vous y rendre pour savoir ce que c'est. Les impressions et les extraits de code devenu beaucoup moins reeadable.

Honnêtement, je utiliser des importations extrêmement rarement pour ces raisons.

3voto

deterb Points 2317

Je ne sais pas par tout autre système automatisé refactorings de faire ce que vous cherchez, mais il y a deux aspects clés de ce faire - un est d'ajouter les importations et l'autre est de retirer le nom de la classe à partir de l'une des constantes.

Pour ajouter les imports, je vous recommandons de coller import static application.KeyHolder.*; après que le paquet sur tous les fichiers qui les utilise.

Pour enlever le nom de la classe, dans l'éclipse faire une Java de recherche pour KeyHolder.* et de recherche pour un champ. Vous pouvez ensuite faire un rechercher/remplacer pour "porte-clés." et remplacer par "". Afin d'éviter les inadéquations assurez-vous que l'élément remplacé compte est égal au nombre de correspondances pour ce fichier. Aussi, assurez-vous de la recherche vers le bas et après le départ des importations.

2voto

Chii Points 7798

Expression régulière a été inventée pour résoudre des problèmes de ce genre! =)

vous aurez besoin d'écrire un petit script (ou utiliser l'IDE regex rechercher/remplacer). Le seul problème est que si il y a beaucoup de classes qui doit être statique importé, alors il est tout aussi beaucoup de travail. Sinon, si c'est juste une classe FOO.BLA, alors vous pouvez utiliser une expression régulière comme

(\bFOO\.(\w+)\b) -> remplacer par groupe de 2 ($2 \2 ou cependant votre regex chercheur ne capture remplace).

vous pouvez essayer ici : http://www.gskinner.com/RegExr/ . Sélectionnez l'onglet remplacer et le type de $2

Un problème peut se poser si vous avez des expressions comme cela: FOO f = FOO.blah + "FOO.blah" , alors faites attention pour que.

Comme pour l'instruction d'importation en haut du fichier, eclipse a une auto fonctionnalité d'importation où il ne autoimport sur format, et il fonctionne tant que le nom de l'importation est assez unique. Ou, si vous ne pouvez pas l'utiliser parce que le nom est trop commun, vous pouvez simplement utiliser un script perl pour faire la regex au lieu de cela, et la faire précéder de la statique des importations.

1voto

Peter Lawrey Points 229686

Cela semble être une bonne idée, mais après avoir changé tous les fichiers, comment seront-ils meilleurs? Vous devriez peut-être penser à ne modifier que les fichiers sur lesquels vous travaillez déjà pour d'autres raisons.

0voto

jqno Points 7831

Si j'étais confronté à un tel défi, j'écrirais probablement un petit programme pour le faire pour moi. Ruby et Python (JRuby et Jython?) Sont assez bien adaptés à la tâche, bien que vous puissiez également le faire en Java.

OK, cela vous prendra probablement au moins le même temps que de le faire à la main, mais au moins vous vous amuserez :).

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