我有一个具有以下类的设计:
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和更好的班级设计实现上述?关键是书籍应仅与书本颜色书(是一本书)相关联,并且仅与colorbookColortype(黑白重复)相关。
。请建议,谢谢。
如果每种类型的Book
必须具有自己的颜色Type
枚举,则使每个类都有仅需要的颜色类型的知识。
因此,请勿将BookColorType color;
从Book
类中获得继承的字段,而是一个私有字段,并使ColorBook
具有其自己的私人颜色类型字段:ColorBookColorType color;
。
此外,如果从两个枚举类中检索一个值(字符串或常见的枚举值或其他内容)以使它们在某种程度上可以操作是有意义的,那么您可以使它们实现特定的接口。
这是一个想法:
- 您可以使您的枚举实现一个接口,例如
BookColorType
。 - 然后,您将把当前的
BookColorType
枚举重命名为BWBookColorType
之类的东西 - 您的
Book
超级类保留构造函数,并将BookColorType
对象作为参数 - 您的
ColorBook
构造器调用super(...)
- 如果参数的实际类型不是
ColorBookColorType
,则可以扔一个 - 请注意,您的
ColorBook
类将没有自己的字段,而是将重复使用Book
的字段,该字段将是类型BookColorType
(接口的类型)
IllegalArgumentException
示例
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!");
}
}
}
关键是用强大的打字来表达约束,而不是像 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 可以具有单色和彩色的颜色。单色Bookbook 仅接受单色颜色。
在 @Mena的帖子上构建,我将使用仿制药执行颜色类型:
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);
}
}