JAVA以对每个子类不同的方式继承基类中的静态字段

时间:2014-12-21 13:28:47

标签: java inheritance static field

我有一个基类

public class base
{
    //some stuff
}

和几个子类

public class sub1 extends base
{
static int variable;
}
public class sub2 extends base
{
static int variable;
}

static int变量存在于每个子类中,因为我在其中存储了每个子类的特征信息。但是如果有一种方法可以将静态int变量移动到基类,那么它对于每个子类仍然会有所不同。 就像现在我重复自己一样,当添加另一个子类时,这是一个不好的做法。

所以任何人都知道如何实现这个目标?也许有适合这种情况的设计模式?

3 个答案:

答案 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模式。