web-dev-qa-db-fra.com

Existe-t-il un équivalent Java ou une méthodologie pour le mot clé typedef en C ++?

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?

234
bn.

Java a des types primitifs, des objets et des tableaux et c'est tout. Pas de typedefs.

107
cletus

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> {}
96
Zed

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.).

14
z -

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.

7
Yair Zaslavsky

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.

5
Zack Yezek

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.

2
mernst

Peut-être que cela pourrait être une autre possibilité de remplacer:

@Data
public class MyMap {
    @Delegate //lombok
    private HashMap<String, String> value;
}
2
shrewquest