从一个地方初始化几个类的几个静态属性(Java)
Initialize several static attributes of several classes from one place (Java)
我有几个 class(Sub1
、Sub2
、Sub3
),它们全部继承自抽象 class(Abs
) .所有 Sub classes 都有几个对所有实例都相同的属性(size
、delay
等)(如静态属性)。我想重新组合所有这些 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 来实现它。您所拥有的类似于管理全局属性的服务。
我有几个 class(Sub1
、Sub2
、Sub3
),它们全部继承自抽象 class(Abs
) .所有 Sub classes 都有几个对所有实例都相同的属性(size
、delay
等)(如静态属性)。我想重新组合所有这些 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 来实现它。您所拥有的类似于管理全局属性的服务。