类设计建议(使用Java实现) - 枚举+继承

时间:2017-10-02 14:40:38

标签: java class inheritance enums

我的设计包含以下类:

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重复)。

请指教,谢谢。

4 个答案:

答案 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);
    }
}