Есть ли способ реализовать алгебраические типы в Java?

StackOverflow https://stackoverflow.com/questions/169662

Вопрос

Возможно ли в 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 не общедоступным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top