我有两个解析器类,我想在解析失败时抛出异常。 我想使用相同的异常,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;
}
}
答案 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.Fields
和ParserB.Fields
没有共同的超类,(原始类型Enum
或Object
除外,但我怀疑这对你有帮助)。
由于无法扩展枚举,我看不出你如何能够使用枚举来解决这个问题。
您可以通过将enum
更改为class
并让ParserA.Field
和ParserB.Field
扩展ParserException.Field
来解决此问题。但是,为了获得与enums
相同的优点,您必须限制实例数。有几种方法可以实现这一点,例如使构造函数受到保护,并且拥有此类型的有限数量的公共静态成员。