gpt4 book ai didi

java - 为什么不使用静态变量来为子类共享对象?

转载 作者:行者123 更新时间:2023-12-01 18:57:54 24 4
gpt4 key购买 nike

我的问题有点长。我正在学习抽象工厂模式

我有一个抽象工厂的抽象类。我想分享混凝土工厂所需的“资源”。所以我只是将 AbstractFactory 内部的变量设为静态

public class AbstractFactory{
private static Vector vector = new Vector();

protected Vector void getVector() {
return vector;
}

protected void setVector(Vector v){
this.vector = v;
}

public abstract Circle createCircle();
}

它的子类将如下所示:

public class ConcreteFactory extends AbstractFactory{
public ConcreteFactory(){
super();
}

public Circle createCircle(){
Circle circle = new Circle();
getVector().add(circle);
return circle;
}
}

但是,我的老师说我不应该使用静态对象实例因为静态变量经常用于一些常量。

因此,我使用实例变量实例而不是静态变量作为 vector ,当我实例化具体工厂时,我从外部传递 vector 。

所以我的类(class)的新设计将如下所示:

public class AbstractFactory{
private Vector vector;

protected Vector void getVector() {
return vector;
}

protected void setVector(Vector v){
this.vector = v;
}

public abstract Circle createCircle();
}

public class ConcreteFactory extends AbstractFactory{
public ConcreteFactory(Vector v){
super();
setVector(v);
}

public Circle createCircle(){
Circle circle = new Circle();
getVector().add(circle);
return circle;
}
}

**

我的问题是:为什么我不应该使用静态变量来共享对象?

**

不用传入Vector,在具体工厂之间共享资源会更容易当我创建混凝土工厂的实例时。

最佳答案

有时,今天让你的生活变得更轻松的事情,却会让你以后的生活变得更加困难。

一些示例:您并不总是知道您的类将被使用的环境。也许工厂的不同实例最终会被不同的类加载器加载(这种情况在 Web 应用程序中经常发生)。这样,使用静态实例变量可能会导致完全不可预测的行为。静态变量几乎总是一个坏主意。

也就是说,我认为你在类里面真正想做的是:

public class AbstractFactory{
private final Vector vector;

protected AbstractFactory(Vector vector){
this.vector = vector;
}

protected Vector void getVector() {
return vector;
}

public abstract Circle createCircle();
}

public class ConcreteFactory extends AbstractFactory{
// USE THIS IF YOU NEED TO SHARE THE VECTOR AMONGST MULTIPLE FACTORY INSTANCES
public ConcreteFactory(Vector vector){
super(vector);
}
// OR USE THIS IF THE VECTOR IS SPECIFIC TO THE FACTORY
public ConcreteFactory(){
super(new Vector());
}

public Circle createCircle(){
Circle circle = new Circle();
getVector().add(circle);
return circle;
}
}

对于此类事情,在实例变量上使用final是一个好主意——它可以防止您意外地更改代码中其他地方的变量。但这是可选的。我所做的关键更改是将 vector 添加到抽象基类的构造函数中,然后从父类(super class)中传递它。

关于java - 为什么不使用静态变量来为子类共享对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com