C'è un modo per implementare i tipi algebrici in Java?
-
05-07-2019 - |
Domanda
È possibile, in Java, imporre che una classe abbia un insieme specifico di sottoclassi e nessun altro? Ad esempio:
public abstract class A {}
public final class B extends A {}
public final class C extends A {}
public final class D extends A {}
Posso in qualche modo imporre che non possano mai essere create altre sottoclassi di A?
Soluzione 4
Codifica della chiesa in soccorso:
public abstract class A {
public abstract <R> R fold(R b, R c, R d);
}
Sono possibili solo tre implementazioni:
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;
}
}
Altri suggerimenti
Dai alla classe A
un costruttore con accessibilità a livello di pacchetto (e nessun altro costruttore).
Grazie, Dave L., per la parte relativa a nessun altro costruttore.
Probabilmente vuoi un enum (Java > = 1.5). Un tipo enum può avere un set di valori fissi. E ha tutti i vantaggi di una classe: possono avere campi e proprietà e possono farli implementare un'interfaccia. Un enum non può essere esteso.
Esempio:
enum A {
B,
C,
D;
public int someField;
public void someMethod() {
}
}
Puoi mettere la classe A, B, C, D in un pacchetto separato e rendere la classe A non pubblica.