2

目前我声明我的所有静态字段如下:

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;

    }

为了让我声明 new Error types,我需要知道Error types基类中的值,这(在我看来)不是很方便,因为我可能不小心Error Type在 的后代类中声明了与fromBase class相同的值. 例如:Error typeBase class

public static final int NEW_ERROR_1 = 0;

这将与

public static final int ERROR_1 = 0;

这会冲突...

我想也许可以使用一个Enum Class,但事实证明你不能扩展它。 可以对枚举进行子类化以添加新元素吗?

另一种选择是对所有静态字段使用 String 值类型而不是 int 值类型,但这不是一个非常有效的解决方案......

如何在不与超类冲突的情况下向类的后代添加更多字段?

4

3 回答 3

3

我会质疑你是否真的想这样做。如果常量对于它们的声明类来说是私有的,那么它们是否重用相同的值又有什么关系呢?如果在上下文中不同的错误不使用相同的值很重要,那么这强烈表明它们实际上不应该是私有的。

如果你真的想这样做,你可以这样做:

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-20T18:06:27.350 回答
2

我看不到您的问题,因为private static final不是继承的属性。你将无法访问OffSpring.ERROR_1它不存在。因此,如果您想使用错误,您可以选择使用枚举并以正确的方式使用它们。如果您确实喜欢整数,那是因为您想使用诸如错误组合之类的技巧,因此您不能使用 value 3

我叫什么错误组合?想象一下,您的脚本由于两个错误而失败,ERROR_1 和 Error_2 如果 ERROR_1 为 1 并且 ERROR_2 为 2 如果您说代码 3 有错误您说您有 ERROR_1 和 ERROR_2 因为 1 是二进制编码为 01 和 2 为10. 3 是他们两个的组合: 11.

如果您想要所有自定义错误的唯一标识,请使用 GUID 生成器,例如

public class GUIDGenerator{
    private int id = 1;
    public int getId(){
          return id++; 
    }
}
于 2013-01-20T18:05:38.457 回答
1

为什么不将错误类型存储在映射中,以便检查错误类型是否已声明,因为这是您想要做的。

有一个Map<String, int> error_types。当您继续添加更多内容时,您可以检查基类并避免冲突。

于 2013-01-20T18:05:36.353 回答