7
votes

"Utilisation" directive en Java

Lorsque le nom de type est trop long, en C #, je peux créer un alias comme celui-ci: xxx pré>

et je peux l'utiliser comme ceci: p>

Dict d = new Dict();
d.Add("key", "value");


1 commentaires

Personnellement, je ne ferais pas cela. Je pense que cela rend le code plus difficile à comprendre. J'importe souvent l'espace de noms complet, donc je n'ai pas besoin de qualifier les types, mais le bit d'aliasing IMO rend simplement plus difficile de comprendre le code en déplaçant la définition de type de l'utilisation. Je préférerais: à l'aide de System.Collection.Generic; ... var d = nouveau dictionnaire ();


4 Réponses :


4
votes

Réponse courte: Nope .

Cependant, vous pouvez (et devrait) importer des classes afin de ne pas utiliser leur nom complet: < Pré> xxx

Si vous DO Définissez un alias puisque votre classe utilise des génériques multi-niveaux ou ce que vous pouvez utiliser ce piratage - en définissant une classe privée qui prolonge la classe Vous aliasant (génériques inclus) uniquement pour avoir une poignée facile à utiliser: xxx

(ajout d'alias de classe a été demandée avant comme une amélioration de Java , et est toujours en attente)


9 commentaires

@Yuval - c'est un mauvais exemple. Toutes les classes dans java.lang sont implicitement importées sur demande.


@Yuval - Je ne veux pas créer de nouveau type. Sera plus de problèmes que d'avantages.


@Yuval - hein? I >> SAVOIR << C'est "juste un exemple". Si vous utilisez comme exemple, une classe qui n'a pas besoin d'être importée, vous pouvez diriger des débutants pour penser qu'ils doivent tout importer. Choisissez un meilleur exemple; c'est-à-dire n'importe quelle classe qui n'est pas dans java.lang .


@MYKHAYLO - Je suggérais juste un hack. Comme je l'ai mentionné dans ma réponse, Java ne vous donne aucun moyen de réaliser cela.


@Yuval - En outre, si vous regardiez au problème de la défaillance de l'insecte, vous verrez qu'il est fermé comme un duplicata d'un autre RFE, et ce dernier est toujours ouvert. Il est donc un peu trompeur d'affirmer que l'amélioration a été refusée.


Créer une nouvelle classe en utilisant des types génériques concrets (comme votre exemple MyMap) est utile pour clarifier des intentions.


@Stephen - pas de dés. Si tous les exemples de moi (ou de quelqu'un d'autre) ont jamais été publiés à 100% - N'ai-pied-à-faire, je serais dans un monde de douleur.


-1 pour un exemple trompeur et trompeur de côté du statut de la RFE


@Yuval - Bien sûr, merci pour votre réponse. Toute allusion est précieuse pour moi. Mais créer un nouveau type n'est pas une option pour moi.



8
votes

Vous ne pouvez pas créer d'alias, mais vous pouvez importer code> paquets ( JLS 7.5 Déclarations d'importation ) de sorte que vous n'ayez pas à qualifier complètement les noms de classe dans ce paquet.

import static java.util.Arrays.asList;

...

System.out.println(asList(1, 2, 3));


4 commentaires

Oui je sais. Mais parfois, le nom de type (sans espace de noms / paquet) est trop long. Exemple: Hashmap - C'est trop long pour moi ... merci pour la réponse.


Aucun aliasing, désolé. Trop peu d'avantages, trop d'inconvénients.


Vous pouvez réellement faire de la classe statique publique MyHashMap étend hashmap {}, puis faire: Nouveau MyHashMap () n'importe où vous en avez besoin.


@Dean: Ce n'est pas un aliasing, c'est défini une nouvelle classe, qui veut spécifiquement éviter.



0
votes

Non, vous ne pouvez pas faire comme ça dans Java.here Vous devez importer les packages, si vous ne souhaitez pas importer le package, vous devez utiliser un nom de classe entièrement qualifié.


0 commentaires

-1
votes

i deuxième tour de sous-classe de Yuval. Ce n'est pas une grosse affaire en matière de performance ou de sémantique.

in c #, dictionnaire est également un nouveau type; Chaque instanciation d'un type générique crée une nouvelle classe au moment de l'exécution.


1 commentaires

"Ce n'est pas une grosse affaire" est une déclaration ridicule sans contexte. Et c # ne fait pas de génériques. CLR fait, et il sait comment replier le code. Donc non, "chaque instanciation d'un type générique crée une nouvelle classe à l'exécution" est également une fausse revendication.