Existe-t-il un moyen d'implémenter des types algébriques en Java?
-
05-07-2019 - |
Question
Est-il possible, en Java, de faire en sorte qu'une classe ait un ensemble spécifique de sous-classes et aucune autre? Par exemple:
public abstract class A {}
public final class B extends A {}
public final class C extends A {}
public final class D extends A {}
Puis-je en quelque sorte faire en sorte qu'aucune autre sous-classe de A ne puisse jamais être créée?
La solution 4
L'église encodant à la rescousse:
public abstract class A {
public abstract <R> R fold(R b, R c, R d);
}
Il n'y a que trois implémentations possibles:
public final class B extends A {
public <R> R fold(R b, R c, R d) {
return b;
}
}
public final class C extends A {
public <R> R fold(R b, R c, R d) {
return c;
}
}
public final class D extends A {
public <R> R fold(R b, R c, R d) {
return d;
}
}
Autres conseils
Donnez à la classe A
un constructeur offrant une accessibilité au niveau du package (et aucun autre constructeur).
Merci, Dave L., pour le brouillon relatif à aucun autre constructeur.
Vous voulez probablement une énumération (Java > = 1,5). Un type enum peut avoir un ensemble de valeurs fixes. Et il a tous les atouts 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() {
}
}
Vous pouvez placer les classes A, B, C et D dans un paquet séparé et rendre la classe A non publique.