Есть ли способ реализовать алгебраические типы в Java?
-
05-07-2019 - |
Вопрос
Возможно ли в Java обеспечить, чтобы у класса был определенный набор подклассов и никаких других?Например:
public abstract class A {}
public final class B extends A {}
public final class C extends A {}
public final class D extends A {}
Могу ли я каким-то образом обеспечить невозможность создания других подклассов A?
Решение 4
Церковь кодирует на помощь:
public abstract class A {
public abstract <R> R fold(R b, R c, R d);
}
Возможны только три реализации:
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;
}
}
Другие советы
Дайте классу A
конструктор с доступностью на уровне пакета (и без других конструкторов).
Спасибо, Дейв Л., за немного о других конструкторах.
Вероятно, вам нужно перечисление (Java >= 1.5).Тип перечисления может иметь набор фиксированных значений.И у него есть все плюсы класса:они могут иметь поля и свойства и могут реализовать интерфейс.Перечисление не может быть расширено.
Пример:
enum A {
B,
C,
D;
public int someField;
public void someMethod() {
}
}
Вы можете поместить класс A, B, C, D в отдельный пакет и сделать класс A не общедоступным.