Gibt es eine Möglichkeit algebraische Typen in Java zu implementieren?
-
05-07-2019 - |
Frage
Ist es möglich, in Java, zu erzwingen, dass eine Klasse eine bestimmte Gruppe von Unterklassen und keine andere hat? Zum Beispiel:
public abstract class A {}
public final class B extends A {}
public final class C extends A {}
public final class D extends A {}
Kann ich irgendwie erzwingen, dass keine andere Unterklassen von A können jemals geschaffen werden?
Lösung 4
Kirche Codierung zur Rettung:
public abstract class A {
public abstract <R> R fold(R b, R c, R d);
}
Es gibt nur drei Implementierungen möglich:
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;
}
}
Andere Tipps
Geben Klasse A
ein Konstruktor mit Paket-Level-Zugänglichkeit (und keine anderen Konstrukteuren).
Danke, Dave L., für die wenig über keine anderen Konstrukteuren.
Sie wollen wahrscheinlich eine ENUM (Java> = 1.5). Ein Aufzählungstyp kann eine Reihe von festen Werten hat. Und es hat alle guten Sachen einer Klasse: sie haben können Felder und Eigenschaften, und kann sie eine Schnittstelle machen implementieren. Ein ENUM kann nicht verlängert werden.
Beispiel:
enum A {
B,
C,
D;
public int someField;
public void someMethod() {
}
}
Sie könnten Klasse A setzen, B, C, D in einem separaten Paket und macht Klasse A nicht öffentlich.