Java顶级枚举 - 超级类型

时间:2017-08-07 20:02:08

标签: java enums

我在J2ee应用程序中有以下枚举,
它们代表DB中学生或教师保存的文档

public enum  StudentDocumentTypeEnum     
           Student Card
           Cafeteria benefit Card               

public enum  TeacherDocumentTypeEnum
           Employee Card
           Benefits Card
           Parking access Card

目前在后端,两个文档都保存到不同的表中,

saveDocument(byteArry[], TeacherDocumentTypeEnum)
saveDocument(byteArry[], StudentDocumentTypeEnum)

我想整合并创建一个单独的模块来保存学生或教师的文件

一种解决方案是创建一种方法来保存将合并为“DocumentTypeEnum”

的文档
saveDocument(byteArry[], DocumentTypeEnum )

但我仍然希望能够区分学生或教师类型的文档枚举, 这里最好的方法是什么?

  • 合并两个枚举
  • 将枚举转换为类层次结构

还有其他建议吗?

2 个答案:

答案 0 :(得分:2)

根据对象属性的值,您不应该有任何代码。这违反了告诉,不要问!原则。

写了这个我'建议创建interface DocumentType{} // empty, just a tag public enum StudentDocumentTypeEnum implements DocumentType{ // .. public enum TeacherDocumentTypeEnum implements DocumentType{ // .. 界面

foreach

答案 1 :(得分:1)

抱歉所有的变化 - 在我写作的时候重新思考它!

选项1 - 接口

你可以创建一个" CardHolder"接口与单个"卡[] getCards()"他们都实现的方法。这两个类会有所不同,但总会返回要保存的文档列表。

public enum  StudentDocumentTypeEnum implements CardHolder
    Card student;
    Card cafeteriaBenefit;
    public Card[] getCards() {// Method on CardHolder
        return new Card[]{student, cafetriaBenifit};
    }

public enum TeacherDocumentTypeEnum implements CardHolder
       Card employee;
       Card benefits;
       Card parkingAccess;
       public Card[] getCards() {// Method on CardHolder
          return new Card[]{employee, benefits, parkingAccess};
       }

选项2 - 反思

另一种选择是接受" Enum"反过来访问它,这样你仍然可以保留现有的结构。请记住,反射有许多缺点 - 它不是明显的代码,它不能被重构"使用工具在编译时未经证实(如果方法签名表明它需要任何" Enum"?),你如何告诉编码员只传入学生或老师?

选项3 - 重构

最后这可能不是枚举的情况。为什么不拥有Student和Teacher对象,每个对象都有一组扩展相同基类或实现相同接口的卡?