Java 子类的惰性初始化

Java 子类的惰性初始化,java,lazy-initialization,Java,Lazy Initialization,为了减少一个类(~850)的NCS数量,我将所有方法拆分为它们自己的类,为了使事情更简单,我扩展了一个包含所有帮助函数的抽象类 AbstractMethod.class public class AbstractMethod { protected String requestWebPage(URL url) { // download a webpage as a string } } public class AccountData extends Abst

为了减少一个类(~850)的NCS数量,我将所有方法拆分为它们自己的类,为了使事情更简单,我扩展了一个包含所有帮助函数的抽象类

AbstractMethod.class

public class AbstractMethod {
    protected String requestWebPage(URL url) {
        // download a webpage as a string
    }
}
public class AccountData extends AbstractMethod {
    public String getAccount(String sessionId){
        String webPage = requestWebPage("http://google.com/"+sessionId);
        system.out.println(webPage);
        return webPage;
    }
}
示例“account”子类

public class AbstractMethod {
    protected String requestWebPage(URL url) {
        // download a webpage as a string
    }
}
public class AccountData extends AbstractMethod {
    public String getAccount(String sessionId){
        String webPage = requestWebPage("http://google.com/"+sessionId);
        system.out.println(webPage);
        return webPage;
    }
}
我有大约10个这样的方法类,只想在调用主/基类中的一个方法时初始化它们:

public class MyBaseClass() {
    private static AccountData ad;

    public MyBaseClass() {
        ad = new AccountData();  // Is there a better way?
    }

    public String getAccount(String sessionId) {
        return ad.getAccount(String sessionId);
    }
}
我尝试在MyBaseClass类中创建一个初始化函数,该函数接受子类型作为参数,并基于其类创建一个对象:

private void initAccount() {
    if (ad == null) {
        ad = new AccountData();
    }
}
但它很难看,我必须每个子班有一个


那么,“正确”的方法是什么呢?有时调用类时,我们只会使用其中的一个或两个方法,因此我不想每次都初始化所有子类。

在我看来,您真正想要的是使用静态方法,而不是抽象的帮助器类,可能还需要使用
导入静态

这样,定义这些方法的类将如您所愿,只在实际调用这些方法后初始化

一般来说,您也不会将继承结构限制在恰好定义方法的位置


当然,这是假设您不为这些方法使用任何实例数据;但是从示例代码的外观来看,似乎不是这样。

用Java实例化类很便宜。如果类在它们的构造函数中没有做任何实质性的事情,那么就做吧

public String getAccount(String sessionId) {
    AccountData ad = new AccountData();
    return ad.getAccount(String sessionId);
}

不要在不必要的地方进行优化。在开始之前分析您的代码。你可能会惊讶于你的假设是多么的错误(我知道我有很多次错误)。

你能再进一步吗?你的意思是,如果我在“AccountData”
publicstatic
中创建了方法,那么我就可以在MyBaseClass中引用它们(假设我导入了它们)?很抱歉,类中有实例数据,它们不能是静态的(但这是我没有预先指定的错误)