Venant d’un arrière-plan C et C++, j’ai trouvé que l’utilisation judicieuse de typedef
était incroyablement utile. Connaissez-vous un moyen d’obtenir des fonctionnalités similaires en Java, qu’il s’agisse d’un mécanisme Java, d’un modèle ou d’une autre méthode efficace que vous avez utilisée?
Java a des types primitifs, des objets et des tableaux et c'est tout. Pas de typedefs.
Si c'est ce que vous voulez dire, vous pouvez simplement étendre la classe que vous souhaitez dactylographier, par exemple:
public class MyMap extends HashMap<String, String> {}
Il n'y a pas de typedef dans Java à partir de 1.6, vous pouvez créer une classe wrapper pour ce que vous voulez, car vous ne pouvez pas sous-classer les classes finales (Integer, Double, etc.).
Comme d'autres l'ont mentionné auparavant,
Il n’existe pas de mécanisme typedef en Java.
Je ne soutiens pas non plus les "fausses classes" en général, mais il ne devrait pas y avoir de règle générale stricte:
Si votre code, par exemple, utilise plusieurs fois un "type générique", par exemple:
Map<String, List<Integer>>
Vous devriez certainement envisager de créer une sous-classe à cette fin.
Une autre approche envisageable est par exemple d’avoir dans votre code une décélération du type:
//@Alias Map<String, List<Integer>> NameToNumbers;
Et utilisez ensuite dans votre code NameToNumbers et ayez une tâche préalable au compilateur (ANT/Gradle/Maven) pour traiter et générer le code approprié Java.
Je sais que cela peut sembler étrange à certains lecteurs de cette réponse, mais c’est ainsi que de nombreux cadres ont implémenté des "annotations" avant JDK 5, c’est ce que fait lombok et d'autres cadres.
En réalité, la seule utilisation de typedef qui se répercute sur Javaland est la création d'alias, c'est-à-dire l'attribution de plusieurs noms à la même classe. C'est-à-dire que vous avez une classe "A" et que vous voulez que "B" se réfère à la même chose. En C++, vous feriez "typedef B A;"
Malheureusement, ils ne le supportent tout simplement pas. Cependant, si vous contrôlez tous les types impliqués, vous POUVEZ tirer un mauvais bidouillage au niveau de la bibliothèque. Vous pouvez soit étendre B à partir de A, soit laisser B implémenter A.
Comme indiqué dans d'autres réponses, vous devriez éviter le pseudo-typedef antipattern . Cependant, les typedefs restent utiles même si ce n’est pas le moyen de les atteindre. Vous voulez faire la distinction entre différents types abstraits qui ont la même représentation Java. Vous ne voulez pas mélanger les chaînes qui sont des mots de passe avec celles qui sont des adresses de rue, ou des entiers qui représentent un décalage avec ceux avec ceux qui représentent une valeur absolue.
Le Checker Framework vous permet de définir une typedef de manière rétro-compatible. Je travaille même pour les classes primitives telles que int
et les classes finales telles que String
. Il n'a pas de surcharge d'exécution et ne rompt pas les tests d'égalité.
La section Type alias et typedefs du manuel de Checker Framework décrit plusieurs façons de créer des typedefs, en fonction de vos besoins.
Peut-être que cela pourrait être une autre possibilité de remplacer:
@Data
public class MyMap {
@Delegate //lombok
private HashMap<String, String> value;
}