2008-10-04 5 views
6

Est-il possible, en Java, de faire en sorte qu'une classe ait un ensemble spécifique de sous-classes et pas d'autres? Par exemple:Existe-t-il un moyen d'implémenter des types algébriques en Java?

public abstract class A {} 
public final class B extends A {} 
public final class C extends A {} 
public final class D extends A {} 

Puis-je appliquer une certaine façon qu'aucune autre sous-classes de A peut jamais être créé?

Répondre

4

Donner la classe A un constructeur avec l'accessibilité au niveau du package (et aucun autre constructeur).

Merci, Dave L., pour le peu d'autres constructeurs.

+0

Sinon tout comme les classes imbriquées avec A ayant un seul constructeur privé. –

+0

Ce n'est pas aussi esthétique, cependant: A.B, A.C ... –

+1

importer statique à la rescousse, marxidad – Apocalisp

0

Vous pouvez placer les classes A, B, C, D dans un package séparé et rendre la classe A non publique.

+1

Faire de la classe A un tri privé qui détruit le but des types de données algébriques (ie, polymorphisme) –

3

Vous voulez probablement une énumération (Java> = 1.5). Un type enum peut avoir un ensemble de valeurs fixes. Et il a tous les avantages d'une classe: ils peuvent avoir des champs et des propriétés, et peuvent leur faire implémenter une interface. Une énumération ne peut pas être étendue.

Exemple:

enum A { 

    B, 
    C, 
    D; 

    public int someField; 

    public void someMethod() { 
    } 


} 
+0

Si je ne me trompe pas, dans votre exemple, B, C et D sont des valeurs, pas des types. – Apocalisp

+0

Ah, tu as raison ... tu ne peux pas créer beaucoup de B :-( – asterite

+0

Mais c'est bien si tu ne veux pas que les sous-types aient un état (dans l'exemple ils n'implémentent même pas de méthodes). –

Questions connexes