Dans un de mes projets Java, je suis rongé par la répétition de code, en raison de la façon dont Java poignées (pas) primitives. Après avoir copier manuellement le même changement à quatre endroits différents (int
, long
, float
, double
) de nouveau, pour la troisième fois, encore et encore , je suis venu très près (?) pour l'accrochage.
Sous des formes diverses, cette question a été soulevée maintenant et puis sur StackOverflow:
- La gestion très répétitives de code et de documentation en Java
- Comment éviter la répétition lorsque vous travaillez avec des types primitifs?
- De passage dynamique de la liste des primitives d'une méthode en Java
Le consensus semblait converger vers deux solutions possibles:
- Utiliser une sorte de générateur de code.
- Que pouvez-vous faire? C est la vie!
Eh bien, la deuxième solution est ce que je fais maintenant et il est en train de devenir dangereux pour ma santé mentale, comme la bien connue technique de torture.
Deux ans ont passé depuis que ces questions ont été posées et Java 7 est arrivé. Je suis, par conséquent, de l'espoir pour une plus facile et/ou plus de solution standard.
Java 7 ont tout changement qui pourrait faciliter la souche dans de tels cas? Je ne pouvais pas trouver quoi que ce soit dans le résumé de modification des résumés, mais peut-être il ya quelque obscure nouvelle fonctionnalité quelque part?
-
Tandis que la source de génération de code est une alternative, je préfère une solution soutenue à l'aide de la norme JDK ensemble des fonctionnalités. Bien sûr, à l'aide de
cpp
ou un autre générateur de code fonctionnerait, mais il ajoute plus dépendances et nécessite des modifications du système de construction.Le seul code du système de production de toutes sortes qui semble être pris en charge par le JDK est via les annotations mécanisme. J'imagine un processeur qui permettrait d'étendre le code source comme ceci:
@Primitives({ "int", "long", "float", "double" }) @PrimitiveVariable int max(@PrimitiveVariable int a, @PrimitiveVariable int b) { return (a > b)?a:b; }
L'idéal du fichier de sortie contient les quatre demandé des variantes de cette méthode, de préférence associés à des commentaires Javadoc e.t.c. Est-il quelque part un processeur d'annotation pour gérer ce cas? Si non, que faudrait-il faire pour en construire un?
Peut-être quelques autres truc qui a surgi récemment?
EDIT:
Une remarque importante: je ne voudrais pas être à l'aide de types primitifs, à moins que j'ai eu raison. Même maintenant, il ya une très réelle de la performance et de l'impact de mémoire par l'utilisation de la boîte de types dans certaines applications.
EDIT 2:
À l'aide de max()
comme un exemple permet l'utilisation de l' compareTo()
méthode qui est disponible en numérique tous types de boîte. C'est un peu plus compliqué:
int sum(int a, int b) {
return a + b;
}
Comment pourrait-on aller sur l'appui de cette méthode numérique pour tous en boîte sans l'écrire six ou sept fois?