2013-01-20 67 views
2

目前我声明,像这样我的所有静态字段:OOP设计:静态字段

public static final int EXAMPLE_OF_STATIC_FIELD = 0; 

说我有一个代表,可以在类中ocurre所有错误字段的基类:

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 classError 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值类型的所有静态字段,但是这并不是一个非常有效的解决方案......

我如何添加更多领域的一个阶级的后代,没有他们与超级阶级冲突?

+0

如果您直接定义常量,总会有错误的可能性。怎么样使用GUID? – SJuan76

回答

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每个定义自己的错误代码,虽然多个子类,你在麻烦。

+0

(obsolate)虽然这回答了这个问题,但请记住artragis关于无法访问基类的私有字段的说法。 – Vincent

+0

嗯......如果有人将新的价值插入到'Base'类中呢?在这种情况下,所有的偏移常数将增加1。如果这些常量在某些数据库表中用作特殊状态值呢? – Andremoniy

+0

谢谢,这似乎是允许的。对不起,这些字段应该是公开的。 –

1

为什么不把你的错误类型存储在地图中,这样你就可以检查错误类型是否被声明,因为这是你想要做的。

有一个Map<String, int> error_types。当你继续添加更多的时候,你可以在基类上进行检查并避免冲突。

2

我看不到您的问题,因为private static final不是继承属性。 您将无法访问OffSpring.ERROR_1它不存在。 所以如果你想使用错误,你可以选择使用枚举并以正确的方式使用它们。 如果你做prefere整数,这是因为你想使用黑客像错误组合,所以你不能使用值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++; 
    } 
}