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

Venant d’un contexte C et C ++, j’ai trouvé l’utilisation judicieuse de typedef pour être incroyablement utile. Connaissez-vous un moyen d’obtenir des fonctionnalités similaires en Java, qu’il s’agisse d’un mécanisme, d’un modèle Java ou d’une autre méthode efficace que vous avez utilisée?

Java a des types primitifs, des objects 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 définir, par exemple:

 public class MyMap extends HashMap {} 

Il n’y a pas de typedef dans java à partir de 1.6, ce que vous pouvez faire est de créer une classe wrapper pour ce que vous voulez puisque vous ne pouvez pas sous-classer les classes finales (Integer, Double, etc.)

En réalité, la seule utilisation de typedef qui est transmise à Javaland est l’aliasing, c’est-à-dire que la même classe donne plusieurs noms. 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 BA;”

Malheureusement, ils ne le supportent pas. Cependant, si vous contrôlez tous les types impliqués, vous POUVEZ faire un piratage au niveau de la bibliothèque. Vous pouvez soit étendre B de A, soit implémenter B avec A.

Comme d’autres l’ont déjà mentionné,
Il n’y a pas de mécanisme typedef en Java.
Je ne supporte pas non plus les “fausses classes” en général, mais il ne devrait pas y avoir de règle générale ssortingcte ici:
Si votre code par exemple utilise encore et encore un “type générique”, par exemple:

 Map> 

Vous devriez certainement envisager d’avoir une sous-classe à cette fin.
Une autre approche que l’on peut envisager est par exemple d’avoir dans votre code une décélération comme:

 //@Alias Map> NameToNumbers; 

Et puis utilisez dans votre code NameToNumbers et ayez une tâche de pré-compilateur (ANT / Gradle / Maven) pour traiter et générer le code Java correspondant.
Je sais que pour certains lecteurs de cette réponse, cela peut sembler étrange, mais c’est combien de frameworks ont mis en place des “annotations” avant JDK 5, c’est ce que fait le projet lombok et d’autres frameworks.

Comme noté dans d’autres réponses, vous devez éviter le pseudo-typedef antipattern . Cependant, les typedefs sont toujours utiles même si ce n’est pas la manière 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 des chaînes qui sont des mots de passe avec ceux 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.

Checker Framework vous permet de définir un typedef de manière rétrocompatible. Je travaille même pour les classes primitives telles que les classes int et final telles que Ssortingng . Il n’a pas de surcharge d’exécution et ne rompt pas les tests d’égalité.

Les alias de type de section et les typedefs du manuel Checker Framework décrivent plusieurs façons de créer des typedefs, en fonction de vos besoins.

Peut-être que cela pourrait être un autre remplacement possible:

 @Data public class MyMap { @Delegate //lombok private HashMap value; } 

Dans certains cas, une annotation de liaison peut correspondre à ce que vous recherchez:

https://github.com/google/guice/wiki/BindingAnnotations

Ou si vous ne voulez pas dépendre de Guice, une annotation régulière suffit.

Vous pourriez utiliser un Enum, bien que ce soit sémantiquement un peu différent d’un typedef en ce sens qu’il n’autorise qu’un ensemble restreint de valeurs. Une autre solution possible est une classe de wrapper nommé, par exemple

 public class Apple { public Apple(Integer i){this.i=i; } } 

mais cela semble beaucoup plus maladroit, d’autant plus que le code n’indique pas clairement que la classe n’a pas d’autre fonction que comme un alias.

Typedef permet d’affecter implicitement des éléments aux types qu’ils ne sont pas. Certaines personnes essaient de contourner cela avec des extensions; lisez ici chez IBM pour une explication de pourquoi c’est une mauvaise idée.

Edit: Bien qu’une inférence de type forte soit utile, je ne pense pas (et j’espère que nous ne le ferons pas) voir le typedef soulever dans les langages gérés (jamais?).

Edit 2: En C #, vous pouvez utiliser une instruction using comme ceci en haut d’un fichier source. Il est utilisé afin que vous n’ayez pas à faire le deuxième élément affiché. Le seul moment où vous voyez le changement de nom est quand une étendue introduit une collision de noms entre deux types. Le renommage est limité à un fichier, en dehors duquel chaque variable / type de paramètre qui l’a utilisé est connu sous son nom complet.

 using Path = System.IO.Path; using System.IO; 

Il n’y a pas besoin de typedef en Java. Tout est un object sauf pour les primitives. Il n’y a pas de pointeurs, seulement des références. Les scénarios dans lesquels vous utiliseriez normalement typedefs sont des instances dans lesquelles vous créez des objects à la place.