Java 面向对象设计:静态字段
目前我声明了所有静态字段,如下所示:Java 面向对象设计:静态字段,java,oop,static,Java,Oop,Static,目前我声明了所有静态字段,如下所示: 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; } 如果
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;
}
如果我扩展了这个基类,并且希望向该类添加更多的错误类型
,我将执行以下操作:
public class OffSpring extends Base {
public static final int NEW_ERROR_1 = 3;
}
为了声明新的错误类型
,我需要从基类中知道错误类型
的值,在我看来,基类不太方便,因为我可能会意外地在基类
的子类中声明一个错误类型
,其值与基类
中的错误类型
相同。例如:
public static final int NEW_ERROR_1 = 0;
这和
public static final int ERROR_1 = 0;
这将与
我曾想过可能使用枚举类
,但结果证明您无法扩展它。
另一个选择是对所有静态字段使用字符串值类型而不是int值类型,但这不是一个非常有效的解决方案
如何向一个类的子类添加更多字段,而不使它们与超类冲突?为什么不将错误类型存储在映射中,以便检查是否声明了错误类型,因为这是您想要执行的操作
出现
映射错误\u类型
。当您继续添加更多时,可以检查基类并避免冲突。我看不出您的问题,因为私有静态final
不是继承属性。
您将无法访问子代。错误1它不存在。
因此,如果您想使用error,您可以选择使用enum并以正确的方式使用它们。
如果您确实更喜欢整数,那是因为您希望使用类似错误组合的hack,因此无法使用值3
我怎么称呼错误组合?
假设脚本由于两个错误而失败,错误1和错误2
如果错误_1是1,错误_2是2,如果你说代码3有错误,你说你有错误_1,错误_2,因为1是二进制编码的01,2是10。3是两者的结合:11
如果希望所有自定义错误都具有唯一标识,请使用GUID生成器,例如
public class GUIDGenerator{
private int id = 1;
public int getId(){
return id++;
}
}
我怀疑你是否真的想这样做。如果这些常量对于它们的声明类是私有的,那么它们重用相同的值又有什么关系呢?如果存在不同错误不使用相同值很重要的上下文,那么这强烈表明它们实际上不应该是私有的 如果你真的想这样做,你可以这样做:
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
的子类,每个子类都定义自己的错误代码,那么你就有麻烦了。如果你直接定义常量,那么总是有可能出错。使用guid怎么样?(obsolite)虽然这回答了问题,但请记住artragis所说的不能访问基类的私有字段。嗯。。。如果有人将新值插入到Base
类中,该怎么办?在这种情况下,所有偏移的常量将增加1
。如果这些常量在某些DB表中用作特殊状态值呢?谢谢,这似乎是允许的。对不起,这些字段应该是公共的。@Andremoniy:是的,对。这似乎很危险,但我从这个问题推断,这是我想要的行为。我喜欢这个想法。但是,如果您有一个扩展“后代”类的类,您会怎么做?