我的设计包含以下类:
public class Book {
protected BookColorType color;
public Book (BookColorType color) {
...
}
}
public enum BookColorType {
BLACK, WHITE
}
public enum ColorBookColorType {
BLACK, WHITE, RED, BLUE, GREEN
}
public class ColorBook extends Book {
protected ColorBookColorType color;
public ColorBook(ColorBookColorType color) {
// this will cause error has ColorBookColorType is not the same type as BookColorType
}
}
如何使用Java实现上述功能并提供更好的类设计? 关键是Book应该只与BookColorType相关联而ColorBook(是Book),并且只与ColorBookColorType相关联(BLACK和WHITE重复)。
请指教,谢谢。
答案 0 :(得分:0)
如果每种类型的Book
都必须有自己的颜色Type
枚举,请让每个类只知道它需要的颜色类型。
因此,不要让BookColorType color;
类中的Book
继承字段,而是其中的私有字段,并使ColorBook
拥有自己的私有颜色类型字段:ColorBookColorType color;
点。
此外,如果从两个枚举类中检索值(String或公共枚举值或其他内容)以使它们以某种方式可互操作是有意义的,则可以使它们实现特定的接口。
答案 1 :(得分:0)
这是一个想法:
BookColorType
。 BookColorType
枚举重命名为BWBookColorType
Book
超类保留构造函数并将BookColorType
对象作为参数ColorBook
构造函数调用super(...)
IllegalArgumentException
ColorBookColorType
ColorBook
类不会有自己的字段,而是会重用Book
的字段,该字段的类型为BookColorType
(接口的类型) 示例强>
public class Book {
protected BookColorType color;
public Book(BookColorType color) {
}
}
public interface BookColorType {}
public enum BWBookColorType implements BookColorType {
BLACK, WHITE
}
public enum ColorBookColorType implements BookColorType {
BLACK, WHITE, RED, BLUE, GREEN
}
public class ColorBook extends Book {
public ColorBook(BookColorType color) {
super(color); // need to be 1st line
if (!(color instanceof ColorBookColorType)) {
throw new IllegalArgumentException("Only colored books!");
}
}
}
答案 2 :(得分:0)
关键是用强类型来表达约束,而不是像 instanceof 这样的惯用运行时检查。
public interface Book {
BookColor getColor();
}
public interface BookColor {
}
public enum MonoChrome implements BookColor {
BLACK, WHITE
}
public enum Colorful implements BookColor {
RED, BLUE, GREEN
}
public final class ColorBook implements Book {
private final Color color;
public ColorBook(final BookColor color) {
super();
this.color = Objects.requireNonNull(color);
}
}
public final class MonoChromeBook implements Book {
private final Color color;
public ColorBook(final MonoChrome color) {
super();
this.color = Objects.requireNonNull(color);
}
}
这样, ColorBook 可以同时使用MonoChrome和ColorFul作为颜色。 MonoChromeBook 仅接受 MonoChrome 颜色。
答案 3 :(得分:0)
在@Mena的帖子基础上,我会使用Generics来强制执行颜色类型:
public interface BookColorType {}
public class Book<C extends BookColorType> {
protected C color;
public Book(C color) {
}
}
public enum BWBookColorType implements BookColorType {
BLACK, WHITE
}
public enum ColorBookColorType implements BookColorType {
BLACK, WHITE, RED, BLUE, GREEN
}
public class ColorBook extends Book<ColorBookColorType> {
public ColorBook(ColorBookColorType color) {
super(color);
}
}
public class BWBook extends Book<BWBookColorType> {
public BWBook(BWBookColorType color) {
super(color);
}
}