使用特定枚举类的超类型参数

时间:2011-01-28 18:46:05

标签: java enums

我有两个解析器类,我想在解析失败时抛出异常。 我想使用相同的异常,ParserException,我可以接受导致失败的字段名称。我想使用枚举,但我想我没有完全清楚这个话题。

如何在ParserException类中声明fieldName?枚举,据我所知,应该是ParserA.Fields和ParserB.Fields的超类型,但不被接受。

请注意这两个枚举类包含一组不同的枚举,即它们不是同一个类。

public class ParserA {

 public enum Fields {
  A_FIRST_FIELD
  A_SECOND_FIELD
 }


 public void parse() {
  ... 
 throw ParserException(Fields.A_FIRST_FIELD);  
 }

}

public class ParserB {

 public enum Fields {
  B_FIRST_FIELD
  B_SECOND_FIELD
 }

 public void parse() {
  ... 
  throw ParserException(Fields.B_FIRST_FIELD);  
 }

}



// Parser error
public class ParserException extends Exception {

 enum fieldName; // ????? what goes here?


 public ParserException(enum e) {
  this.fieldName = e;
 }

 public enum getFieldName() {  // ?????? how do I do something like this?
  return fieldName;
 }

}

4 个答案:

答案 0 :(得分:1)

好吧,你可以 ParserException存储一个Enum<?>,但这并不能提供任何真正的优势,而不仅仅是使用Object作为类型对于ParserException中的字段。

如果不改变你在这里所做的设计,我的偏好是制作一个名为Field的标记界面,并让你所有代表字段的enum实现...然后ParserException可以使用Field作为其存储的对象类型。

public interface Field {
}

...

public enum Fields implements Field {
  A_FIRST_FIELD,
  A_SECOND_FIELD
}

...

public class ParserException extends Exception {
  private final Field field;

  public ParserException(Field field) {
    this.field = field;
  }

  public Field getField() {
    return field;
  }
}

在大多数情况下,某些内容是enum应该是一个实现细节,没有其他任何内容需要关注。

答案 1 :(得分:1)

  据我所知,

枚举应该是ParserA.Fields和ParserB.Fields的超类型

不是枚举,但枚举是常见的超类型(或更准确地说是Enum<?>)。但是你可能不想使用它,它太笼统了。使用像

这样的东西可能会更好
 // ParserExceptionKind is probably a better name
 public interface ParserEnum { 
      String name();
      // some useful methods go here
 }

 public class ParserA implements ParserEnum {
      public enum Fields {
           A_FIRST_FIELD
      }
 }

 public class ParserException extends Exception {
      private ParserEnum parserEnum;
      ...
 }

但是,大多数情况下,最好创建单独的Exception子类。

答案 2 :(得分:0)

只需使用Fields类型,就像使用普通类一样。

Fields fieldName;

与其他情况类似。

BTW,枚举通常以单数形式命名(再次,就像类一样,枚举不是 不同)。

修改
您可以使用Enum类(所有枚举的公共超类),甚至Object

但坦率地说,我认为用一个元素声明枚举类没有什么意义。你可能只是使用字符串常量:功能相同而且不那么混乱。

答案 3 :(得分:0)

ParserA.FieldsParserB.Fields没有共同的超类,(原始类型EnumObject除外,但我怀疑这对你有帮助)。

由于无法扩展枚举,我看不出你如何能够使用枚举来解决这个问题。

您可以通过将enum更改为class并让ParserA.FieldParserB.Field扩展ParserException.Field来解决此问题。但是,为了获得与enums相同的优点,您必须限制实例数。有几种方法可以实现这一点,例如使构造函数受到保护,并且拥有此类型的有限数量的公共静态成员。