有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java子类何时以及为什么要声明父类的静态实例成员?

这是一些遗留代码中的另一种设计模式,我在谷歌上找不到太多。在本例中,子类扩展其抽象父类,但随后右转并声明父类的静态实例:

public abstract class MessageBase {
    protected DAOFactory factory;
    // method declarations
}

public class EDWMessage extends MessageBase {
    private static MessageBase instance;

    public static MessageBase getInstance(Properties properties) {
        if (instance == null) {
            instance = new EDWMessageTransaction(properties, null);
        }
        return instance;
    }
//more code
}

我不确定我是否理解是什么驱动了这个设计模式(如果它是一个已知的模式)。这是一种方便的模式,可以避免将父级的每个成员变量声明为静态的吗?或者,这意味着允许多个子类每个都有一个父类实例。但是如果是这样的话,为什么仅仅在简单的构图上过度使用继承呢

代码的其余部分没有说明为什么会这样做。任何想法或想法都将不胜感激。谢谢

另外,我似乎遇到了很多有趣的designpatterns遗留代码,我不知道如何处理这些代码。感谢所有帮助过我的人

编辑:展开代码示例。当我发现某个地方实际使用此代码时,将再次编辑。是的,没有文件


共 (2) 个答案

  1. # 1 楼答案

    这是线程安全的惰性单例初始化的常用习惯用法。如果可以有一个单例类,那么可以委托给一个私有的静态实例化类

    public class MySingleton{
    
       private MySingleton(){
    
       }
    
       public static MySingleton getInstance(){
           return SingletonCreator.INSTANCE;
       }
    
       private static class SingletonCreator{
         private static final MySingleton INSTNACE = new MySingleton();
       }
    }
    

    不确定这是否是您的子类的使用方式,但这将是持有其父类静态实例的子类的一个用例

  2. # 2 楼答案

    最初的意图可能是,对于MessageBase的每个子类,应该只有一个实例,并且可以使用基类中的commom方法访问该实例

    因此,您可以迭代所有消息类型,并获得每个消息类型的实例

    我的20美分