目前,我声明我的所有静态字段如下:
public static final int EXAMPLE_OF_STATIC_FIELD = 0;假设我有一个基类,它的字段代表了类内可能锁定的所有错误:
public class Base {
public static final int ERROR_1 = 0;
public static final int ERROR_2 = 1;
public static final int ERROR_3 = 2;
}如果我扩展这个基类并希望向类中添加更多的Error types,我将执行以下操作:
public class OffSpring extends Base {
public static final int NEW_ERROR_1 = 3;
}要声明新的Error types,我需要从基类中知道Error types的值,在我看来,这不太方便,因为我可能会意外地在Base class的子类中声明Error Type,其值与Base class中的Error type相同。例如:
public static final int NEW_ERROR_1 = 0;这将与
public static final int ERROR_1 = 0;会有冲突..。
我想也许使用一个Enum Class,但是事实证明你不能扩展它。Can enums be subclassed to add new elements?
另一种选择是对所有静态字段使用字符串值类型而不是int值类型,但这不是一个非常有效的解决方案.
我如何在一个类的后代中添加更多的字段,而不与超类冲突呢?
发布于 2013-01-20 18:06:27
我会怀疑你是否真的想这么做。如果常量对它们的声明类是私有的,那么如果它们重用相同的值又有什么关系呢?如果在某个上下文中,不同的错误不使用相同的值是很重要的,那么这就强烈地表明,它们实际上不应该是私有的。
如果你真的想这样做,你可以这样做:
public class Base {
private static final int ERROR_1 = 0;
private static final int ERROR_2 = 1;
private static final int ERROR_3 = 2;
protected static final int LAST_ERROR = ERROR_3;
}
public class OffSpring extends Base {
private static final int NEW_ERROR_1 = Base.LAST_ERROR + 1;
}但是,如果您想拥有Base的多个子类(每个子类都定义自己的错误代码),那么您就有麻烦了。
发布于 2013-01-20 18:05:38
我看不出您的问题,因为private static final不是继承的属性。您将无法访问不存在的OffSpring.ERROR_1。因此,如果您想使用错误,您可以选择使用枚举并以正确的方式使用它们。如果你做了前置整数,那是因为你想要使用像错误组合这样的哈克,所以你不能使用值3。
我把错误组合称为什么?如果您的脚本因两个错误而失败,ERROR_1和Error_2 (如果ERROR_1为1,而ERROR_2为2),如果您说您在代码3中有一个错误,您说您获得了ERROR_1和ERROR_2,因为1是二进制代码,编码为01,2是它们的组合。
如果要对所有自定义错误进行唯一标识,请使用GUID生成器,例如
public class GUIDGenerator{
private int id = 1;
public int getId(){
return id++;
}
}发布于 2013-01-20 18:05:36
为什么不将错误类型存储在地图中,这样就可以检查错误类型是否声明了,因为这正是您想要做的。
有一个Map<String, int> error_types。当您继续添加更多时,您可以在基类上进行检查并避免冲突。
https://stackoverflow.com/questions/14427433
复制相似问题