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);
}
可能な実装は3つのみです。
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
をパッケージレベルのアクセシビリティを持つコンストラクターに渡します(他のコンストラクターはありません)。
Dave L.、他のコンストラクタがないことをありがとう。
おそらく列挙型が必要です(Java&gt; = 1.5)。列挙型には、一連の固定値を含めることができます。そして、クラスのすべての利点があります。フィールドとプロパティを持ち、インターフェースを実装することができます。列挙型は拡張できません。
例:
enum A {
B,
C,
D;
public int someField;
public void someMethod() {
}
}
クラスA、B、C、Dを個別のパッケージに入れ、クラスAを非公開にすることができます。
所属していません StackOverflow