9
votes

Singletons, énums et classes intérieures anonymes

Comme vous le savez peut-être, certaines personnes déclarent des singletons avec une instance d'une instance 1, car la JVM garantit qu'il y aura toujours une seule instance sans problèmes de simultanément à gérer ...

Ainsi, qu'en est-il d'une énumération avec Plusieurs instances? Pouvons-nous dire quelque chose comme un énumé est une sorte d'ensemble commandé de singletons partageant une interface commune? Pourquoi? xxx

dans ce code pourquoi cela ne fonctionne pas: Avec_taxes.getformattedprice (33F); Quel est l'intérêt de déclarer une méthode publique s'il ne peut être appelé sans passer à travers l'interface commune? Je suppose que c'est la raison pour laquelle je ne vois aucune syntaxe pour pouvoir déclarer une interface uniquement pour l'une des instances d'un énumé.


EDIT:

Il semble que les instances Enum sont un type spécial de classes anonymes. Ainsi, je comprends pourquoi vous ne pouvez pas appeler cette méthode.

Ma question est un peu liée à: Pourquoi une classe anonyme peut-elle implémenter une interface (en plus de l'interface Peut déjà implémenter!)

Je comprends totalement pourquoi nous ne pouvons pas faire cela: xxx

(getName ici n'est pas une substitution)

Pourquoi je ne comprends pas, c'est pourquoi nous ne pouvons pas faire cela avec des classes anonymes: xxx

ou quelque chose qui entraînerait la même chose. Pensez-y: Si vous n'utilisez pas de classes anonymes, vous pouvez absolument étendre la classe de véhicule, puis rendre cette sous-classe implémenter toutes les autres interfaces que vous souhaitez ...

Je suis sûr que si c'était possible que si c'était possible serait capable d'appeler avec_taxes.getformattedprice (33f) de manière TypeAsE, car avec_taxes ne serait pas un véritable énumprodicetype, mais il ne serait qu'une sous-classe d'énumprocetsType, avec sa propre interface, et en appelant avec_taxes.geformattedprice (33F) avec une codée papier Avec_taxes, vous savez à compiler que vous appelez Enumpricetype de vous appelez.

Donc, ma question est la suivante: Y a-t-il des raisons pour lesquelles cela n'est pas possible? Ou ça n'a pas encore été fait?


3 commentaires

Ce n'est pas un modèle spécial - c'est exactement la manière dont un modèle typeAfeafe était destiné à être utilisé.


Bill K en fait, ce que j'attends est toujours tatsafe parce que je n'attends pas sans_taxes.getformattedprice (33f); être appelable à la compilation, et je ne m'attends pas à ce que Geformattedprice (33f) soit appelable avec le polymorphisme soit


Oui, je n'étais pas en désaccord avec vous - je disais simplement que c'est ainsi que Enums était destiné à être utilisé - ce que vous avez défini est un véritable oo énum. Le modèle original de celui-ci a été appelé le "type Typeafe Enum", mais je suppose que ce n'est plus un nom approprié, car Enums une fois introduit dans la langue était tout type de type.


3 Réponses :


2
votes

Ajouter

       public String getFormattedPrice(float input) {
        return input + " €";
    }


2 commentaires

Andrew merci mais je le sais déjà très bien depuis que je me prépare pour SCJP. Ce que je veux, c'est pouvoir interdire au moment de la compilation, appeler sans_taxes.getformattedprice (33f); mais pour le permettre uniquement avec_taxes.getformattedprice (33f);


Une approche serait une hiérarchie d'interfaces. prix et taxéprice prolonge le prix . Maintenant, vous avez deux classes enums pour correspondre. Les Enums ne peuvent pas s'étendre mutuellement, mais chacun implémente leur interface respective. Donc, vous pouvez déposer dans un prix ou taxedprice lorsque vous avez besoin d'un objet général et que vous ne voulez pas utiliser l'ENUM. (Je dois admettre que j'ai du mal à voir un cas d'utilisation pour cela, mais ...)



11
votes

Votre énum est équivalente à la classe normale suivante (en fait, c'est à peu près ce que le compilateur le transforme): xxx

getformattedprice () méthode est indisponible sur le type abstrait et ne peut donc pas être appelé à partir de la méthode principale. Considérez ce qui se produirait si la méthode principale est réécrite d'utiliser une variable locale: xxx

ceci ne compile pas car getformattedprice () n'est pas disponible sur la classe de base. Étant donné que le with_taxes instance est une sous-classe anonyme énumprimétype , il n'y a aucun moyen que vous puissiez définir la variable locale à un type où le getformatpedprice () La méthode est visible.

comme une observation méta, il s'agit d'une différence essentielle entre des langages fortement typées telles que Java et des langues "Débôt de canard" telles que Ruby. Ruby sera heureusement invoquer la méthode getformattedprice () si elle se trouve être là, quel que soit le type d'objet organisé dans la variable foo .

comme Une autre observation méta, il n'a pas beaucoup de sens pour différentes constantes du même Enum d'avoir des méthodes différentes. Si vous ne pouvez pas mettre tout ce dont vous avez besoin comme des méthodes abstraites (ou concrètes) sur le type Enum de base, vous utilisez probablement le mauvais outil pour résoudre le problème.


4 commentaires

Clarification - Il ne fait pas de sens pour différentes constantes d'avoir des ensembles différents ^ de méthodes ^ que le type d'énumérateur lui-même ^. (Ils peuvent avoir différents ensembles de remplacement des méthodes d'énumérateur.)


Merci pour cette réponse. En fait, je ne m'attends pas à foo.getformattedprice (33f); pouvoir être appelé et comprendre clairement pourquoi. Je voudrais juste vous attendre à l'appel avec_taxes.getformattedprice (33f);


Andy Thomas-Cramer J'ai trouvé un cas où il serait agréable de pouvoir aussi appeler une seule méthode sur une seule des instances de la classe ...


BTW Si la "version classique Java" d'Enum que Barend Devoir ci-dessus utilisait des sous-classes réelles au lieu de classes anonymes, ce serait possible, alors pourquoi pas avec Enums aussi?



0
votes

Ainsi, qu'en est-il d'une énumération avec plusieurs instances?

Il n'y a rien de tel, et votre exemple ne le démontre pas. Vous avez un énumé avec plusieurs valeurs . ils sont tous des singletons.


1 commentaires

Et? Comme vous l'avez dit, une valeur d'énorme, comme vous l'avez dit, un singleton. Un singleton est un exemple. Donc un énum peut avoir plusieurs valeurs, des instances, des singletons ... Je ne comprends toujours pas ce que vous voulez dire là-bas