从一个地方初始化几个类的几个静态属性(Java)

时间:2016-07-11 15:57:14

标签: java static initialization code-duplication

我有几个类(Sub1Sub2Sub3)继承了抽象类(Abs)。所有Sub类都有几个属性(sizedelay等),它们对所有实例都是相同的(如静态属性)。我想重新组合所有这些子类属性(和访问器),以避免重复代码并从一个地方初始化它。有可能吗?

这是一个代码示例,显示了我为获得所需行为而必须采取的措施:

public abstract class Abs {
    protected static final int DEFALUT_SIZE = 1000;
    protected static final int DEFALUT_DELAY = 1000;
}

class Sub1 extends Abs {
    private static int size;
    private static int delay;

    public Sub1() {
        size = DEFALUT_SIZE;
        delay = DEFALUT_DELAY;
    }

    public void setSize(int size) { this.size = size; }
    public int getSize() { return size; }
    public void setDelay(int delay) { this.delay = delay; }
    public int getDelay() { return delay; }
}

class Sub2 extends Abs {
    private static int size;
    private static int delay;

    public Sub1() {
        size = DEFALUT_SIZE;
        delay = DEFALUT_DELAY;
    }

    public void setSize(int size) { this.size = size; }
    public int getSize() { return size; }
    public void setDelay(int delay) { this.delay = delay; }
    public int getDelay() { return delay; }
}

class Sub3 extends Abs {
    /* Same code here */
}

我想做以下事情:

Sub1 sub1 = new Sub1();

int size = Sub1.getSize(); // size == 1000

Sub1.setSize(500);
Sub2.setSize(700);

size = sub1.getSize(); // size == 500
size = Sub1.getSize(); // size == 500
size = Sub2.getSize(); // size == 700

使用这个解决方案,我被迫在每个子类中重写所有相同的代码。

我了解到静态属性没有被继承,所以不可能从抽象类中这样做......

1 个答案:

答案 0 :(得分:1)

通常一个好主意是,在除常量之外的所有情况下,关键字static都是邪恶的,应该不惜一切代价避免使用。

如果你从大小和延迟前删除了static关键字,使它们受到保护,并将它们与初始化代码一起移动到抽象Abs类中,以设置它们的初始值以及访问器和变更器(getters)然后你就可以从子类中删除它们的声明和初始化。

您的代码应如下所示:

public abstract class Abs {
private static final int DEFALUT_SIZE = 1000;
private static final int DEFALUT_DELAY = 1000;

private int size = DEFAULT_SIZE;
private int delay = DEFAULT_DELAY;

public void setSize(int size) { this.size = size; }
public int getSize() { return size; }
public void setDelay(int delay) { this.delay = delay; }
public int getDelay() { return delay; }
}

然后扩展Abs类的任何东西都将具有这些属性。

要在对象之间共享这些属性,您必须做一些不同的事情,但有很多选择。您可以拥有一个公共类,该类包含在创建时注入每个实例的共享值,或者您可以使用某种事件/观察者模式。然而,首先想要这是一件非常奇怪的事情。通常我们会有某种代表这些信息的中心对象,只是根据需要传递它 - 你通常不会在子类上设置setter和getter来实现它。您所拥有的是类似于管理全球属性的服务。