我有一个基类
public class base
{
//some stuff
}
和几个子类
public class sub1 extends base
{
static int variable;
}
public class sub2 extends base
{
static int variable;
}
等
static int变量存在于每个子类中,因为我在其中存储了每个子类的特征信息。但是如果有一种方法可以将静态int变量移动到基类,那么它对于每个子类仍然会有所不同。 就像现在我重复自己一样,当添加另一个子类时,这是一个不好的做法。
所以任何人都知道如何实现这个目标?也许有适合这种情况的设计模式?
答案 0 :(得分:0)
您不能将派生类中的所有不同静态变量移动到基类中,因为static
变量是每个类一个;你希望你的变量是每子类一个,这是不允许的。
您可以通过在基类中定义子类的注册表来解决此问题,并为每个子类存储int
。但是,这会增加更多的复杂性,并且不清楚如何区分超类中的子类。
您当前的解决方案似乎是最佳的。
答案 1 :(得分:0)
不要使用静态字段 - 这不是可行的方法,因为子类的静态字段不会覆盖"那些超级班。
相反,因为给定类的值是常量,所以使用最终实例字段:
public class Base {
protected final int variable;
public Base() {
this(5);
}
protected Base(int v) {
variable = v;
}
}
public class Sub1 extends Base {
private static int v = 7;
public Sub1() {
super(v);
}
}
现在变量已修复并可供所有实例访问。
答案 2 :(得分:-2)
您当然可以将变量移动到基类中,但它不能是静态的。或者,您可以创建在每个子类中覆盖的静态getter。以下是两者的示例:
public class base {
protected int variable;
protected static int getVariable() {
return -1;
}
}
public class Sub1 extends base {
public Base() {
variable = 0;
}
protected static int getVariable() {
return 0;
}
}
public class Sub2 extends base {
public Sub2() {
variable = 1;
}
protected static int getVariable() {
return 1;
}
}
作为一种设计原则,我真的很想要静态方法,这种情况有点罕见(在我看来)。通常,您将使用该类的一些实例。如果您希望一大堆对象共享您在运行时配置的一些常见行为,则可能需要查看flyweight模式。