9
votes

Pourquoi le super constructeur ne peut-il pas être invoqué d'un constructeur enum?

Class c = Class.forName("/*path*/.A");
System.out.println(c.getSuperclass().getName());
System.out.println(Modifier.toString(c.getSuperclass().getModifiers()).contains("abstract"));
System.out.println(c.getSuperclass().getSuperclass().getName());

0 commentaires

4 Réponses :


1
votes

C'est un fait que vous ne pouvez pas déclarer un Enum comme prolongeant une autre classe. Par conséquent, il n'y a qu'un seul possible super constructeur pour un Enum .

Je suppose que depuis que vous ne pouvez pas chaîner à autre chose que super () Ils ont décidé qu'il ne valait pas la peine d'autoriser l'utilisation de super du tout Un constructeur Enum .

de toute façon, vous ne perdez rien.


2 commentaires

Je pense que l'init. d'un objet est terminé quand Super () -> Super () -> Super () -> Object atteint l'objet. Donc, comment cela peut être initialisé sans appeler super () alors n'atteint jamais l'objet alors comment il peut être prolongé de java.lang.Object


Hein??? Je n'ai pas dit qu'un super constructeur n'était pas appelé. J'ai seulement dit qu'il ne peut s'agir que d'être un tel super constructeur, donc le super () syntaxe serait redondant. (Je présume que vous comprenez ce qui se passe dans un constructeur normal lorsque vous laissez la sortie super appel ...)



7
votes

du didacticiel Java sur Enums:

Tous les énums s'étendent implicitement java.lang.enum. Puisque Java ne Soutenir de multiples héritage, un énumé ne peut rien prolonger d'autre.

Vous ne pouvez pas appeler le constructeur super () car le compilateur insère automatiquement un appel caché à super (nom, ordinal) dans n'importe quel constructeur que vous définissez.


6 commentaires

Merci pour votre commentaire. La classe A ne s'étend d'aucune autre classe. Je veux juste appeler super () pour voir que c'est une hiérarchie héritarière. A-> java.lang.enum-> java.lang.Object donc j'ai le bon appel super () à java.lang.enum puis super () à java.lang.Object


Enums sont "spéciaux". Vous avez un "droit" d'appeler super sur des classes ordinaires, mais que Enums ont plus de restrictions.


Et ma question est que, pourquoi?


Pourquoi pas? Pourquoi ajouter une complexité supplémentaire à la langue quand elle n'est pas requise? Peut-être devriez-vous nous donner un cas d'utilisation valide pour vouloir faire cela.


Je veux dire, c'est contraire à la philosophie OO. Être un objet sans être (appelant) objet? Je pense que Enum n'a aucune raison particulière de regarder cela. Asgriquer la classe A {}; La classe B étend un {privé B () {super (); }} Il est donc aussi inutile ici mais c'est légal. Je pense qu'il y a une logique différente derrière elle ou ils (Java Core Developers) accrochent simplement pour le coder


Vous ne semblez pas savoir que le compilateur insère un super () s'appelle lui-même. Ce n'est rien à voir avec 'Oo Philosophy'.



9
votes

Enums implique beaucoup de magie au niveau du compilateur et de l'exécution pour garantir que == comparaisons fonctionnera toujours:

C'est une erreur de compilation pour tenter d'instancier explicitement un type d'énumération (§15.9.1). La méthode de clone finale de Enum garantit que les constantes d'enum ne peuvent jamais être clonées et que le traitement spécial par le mécanisme de sérialisation garantit que des instances en double ne sont jamais créées à la suite de la désérialisation. L'instanciation réfléchissante des types d'énumération est interdite. Ensemble, ces quatre choses garantissent qu'aucune instance d'un type d'énumération n'existe pas au-delà de ceux définis par les constantes d'enum.

Spécification de la langue Java Section 8.9

Il n'y a pas de constructeur sans paramètre sans paramètre, seulement enum (nom de cordes, intornal). Mais permettant d'appeler celui-là avec de mauvais paramètres causerait évidemment des problèmes.


2 commentaires

Merci pour votre commentaire. Regardons cet exemple. Classe abstraite A; et la classe B étend un {privé B () {super ()}}. Vous pouvez le faire mais pas dans Enum. Pourquoi ? A N'a pas aussi aucun constructeur mais super () y ajouté à l'exécution. Pourquoi pas pour Enum?


S'il n'y a pas de constructeur, Java en créera un sans paramètres. Si vous ajoutez un constructeur A (String Bla), le paramètre super () ne fonctionnera plus. Enum est vraiment spécial, il y a beaucoup de magie cachée. Le compilateur / runtime insère un appel à Super (nom, index). Et est crucial que cet appel est effectué avec les bons paramètres, le compilateur a donc un cas particulier qui empêche manuellement l'appelant le super constructeur. En d'autres termes: les internes d'Enums sont un grand hack sale.



1
votes

car il n'y a pas de constructeur Super (), voir la réponse de Dogbane, et parce que le compilateur insère automatiquement l'appel Super (...) requis, Idem.

Pourquoi s'agit-il d'un problème?


2 commentaires

Je pense que c'est un problème, à cause de la standard / style de codage à utiliser super dans les constructeurs. Sa norme appelée, car elle n'a pas à faire Sens.


@ 01: Si votre norme de codage vous indique que vous appelez des constructeurs de superclasses qui n'existent pas, alors il y a quelque chose de gravement faux avec cela. Plus probablement, vous avez mal compris l'exigence. Vous devez appeler Super (x, Y, ...) pour certains X, Y, ... qui existent comme des arguments du constructeur.