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

Initialize several static attributes of several classes from one place (Java)

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

这是一个代码示例,显示了我为获得所需行为而被迫执行的操作:

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

使用此解决方案,我不得不在每个子classes 中重写所有相同的代码。

我了解到静态属性不是继承的,所以不可能从抽象中做到这一点 class...

一般来说,假设在除常量以外的所有情况下,关键字 static 都是有害的,应不惜一切代价避免使用。

如果你把size和delay前面的static关键字去掉,保护起来,把它们和初始化代码一起移到抽象Abs中class来设置它们的初始值和访问器和修改器(getter 和 setter),那么您就可以从 subclasses.

中删除它们的声明和初始化

您的代码应如下所示:

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 class 的东西都将具有这些属性。

要在对象之间共享这些属性,您必须做一些不同的事情,但是有很多选择。您可以有一个公共 class 来保存在创建时注入到每个实例中的共享值,或者您可以使用某种 eventing/observer 模式。然而,这首先是一件很奇怪的事情。通常我们会有某种表示此信息的中心对象,并根据需要传递它——您通常不会在 subclasses 上使用 setter 和 getter 来实现它。您所拥有的类似于管理全局属性的服务。