286 votes

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

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

6 votes

Le typedef peut être utilisé pour de nombreuses choses, bonnes et mauvaises, bien que tout le monde ne soit pas d'accord sur lesquelles. Pourriez-vous nous dire quels sont les aspects de typedef qui vous semblent intéressants ? De cette façon, nous pourrons vous dire comment obtenir des effets similaires en Java ou pourquoi c'est quelque chose que vous ne voulez pas faire en Java. La collection de réponses ci-dessous suppose que vous parlez de l'utilisation préférée (ou la plus détestée) de l'auteur.

3 votes

J'aime typedef les types natifs si je peux en faire une classe plus tard. typedef IndexT int ; par exemple. Plus tard, si je veux que IndexT devienne une classe, je l'implémente simplement et j'enlève le typedef. Cela permet de cacher l'information.

13 votes

124voto

cletus Points 276888

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

47 votes

Je suppose que la plupart des gens veulent typedef pour redéfinir boolean à bool .

81 votes

@TomášZato Je ne connais pas la plupart des gens, mais d'après mon expérience, c'est utile pour ajouter de la sémantique comme : typedef int PlayerID qui permet au compilateur de s'assurer que les PlayerID ne sont pas utilisés de manière interchangeable avec d'autres ints, et qui rend également le code beaucoup plus lisible pour les humains. En gros, c'est comme un enum mais sans un ensemble limité de valeurs.

93 votes

@TomášZato C'est également utile pour raccourcir des types longs comme typedef MegaLongTemplateClass<With, Many, Params> IsShorten; .

118voto

Zed Points 27408

Si c'est ce que vous voulez dire, vous pouvez simplement étendre la classe que vous souhaitez typer, par ex :

public class MyMap extends HashMap<String, String> {}

7 votes

Je me demande si cela est plus anti-modèle que l'utilisation de typedef en C.

23 votes

C'est vraiment le cas. typedef n'a aucun des problèmes que l'article décrit pour ces fausses classes (et ils sont bien réels).

2 votes

De plus, ce n'est même pas possible avec les classes finales telles que java.lang.String

15voto

z - Points 5610

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

7 votes

L'article anti-modèle référencé est basé sur l'hypothèse que vous voulez simplement raccourcir votre typage (ce qui cacherait en fait les informations utiles sur le type). L'utilisation réelle que la plupart des gens souhaitent est de désambiguïser les types et de laisser le compilateur faire son travail pour vous. Voir IndexT ci-dessus. public Invoice fetchInvoiceItem(String, String, String) ; versus public Invoice fetchInvoiceItem(CustomerId, InvoiceId, InvoiceLineItemId) ; Les types explicites plus les convertisseurs/vérificateurs rendent la programmation des API Web où TOUT commence par une chaîne beaucoup plus sûre.

2 votes

Il n'y a pas de surcharge d'opérateurs en Java, donc c'est moche.

5voto

Zack Yezek Points 41

En fait, la seule utilisation de typedef qui soit transposée à Javaland est l'alias, c'est-à-dire le fait de donner plusieurs noms à une même classe. Autrement dit, vous avez une classe "A" et vous voulez que "B" fasse référence à la même chose. En C++, vous feriez "typedef B A ;".

Malheureusement, ils ne le supportent pas. Cependant, si vous contrôlez tous les types impliqués, vous pouvez réaliser un piratage méchant au niveau de la bibliothèque : soit vous étendez B à partir de A, soit B implémente A.

15 votes

Avoir typedef serait également utile pour créer des alias pour les invocations de types génériques. Par exemple : typedef A<Long,String> B; (il s'agit peut-être d'un cas particulier de ce que vous avez décrit, mais cela montre un peu plus clairement l'intérêt de l'idée).

0 votes

Dans mon cas d'utilisation, je veux donner des alias aux types primitifs. real_t pour double et bool pour boolean .

-6voto

Steve B. Points 23227

Vous pourriez utiliser un Enum, bien que ce soit sémantiquement un peu différent d'un typedef dans la mesure où il n'autorise qu'un ensemble restreint de valeurs. Une autre solution possible est une classe d'enveloppe nommée, par exemple

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

mais cela semble bien plus compliqué, d'autant plus qu'il n'est pas clair dans le code que la classe n'a pas d'autre fonction que celle d'un alias.

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