【问题标题】:Lazy initialization of subclass子类的延迟初始化
【发布时间】:2013-11-07 15:16:40
【问题描述】:

为了减少一个类的 NCSS 数量(约 850 个),我将所有方法拆分为它们自己的类,并且为了使事情更容易,我扩展了一个包含所有辅助函数的抽象类。

AbstractMethod.class

public class AbstractMethod {
    protected String requestWebPage(URL url) {
        // download a webpage as a string
    }
}

Example "account" subclass

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 lazy-initialization


    【解决方案1】:

    在我看来,您真正想要的是使用静态方法而不是抽象辅助类,也许还有import static

    这样,定义这些方法的类将如您所愿,仅在方法被实际调用时才被初始化。

    您通常也不会将继承结构限制在恰好定义方法的位置。

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

    【讨论】:

    • 你能再扩展一点吗?你的意思是如果我在“AccountData”public static 中创建了这些方法,那么我可以在 MyBaseClass 中引用它们(假设我导入了它们)?而且,对不起,但是是的,类中有实例数据,它们不能是静态的(但这是我没有预先指定的错)
    【解决方案2】:

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

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

    不要在不需要的地方进行优化。之前分析您的代码。您可能会惊讶自己的假设有多么错误(我知道我错了很多次)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2020-10-08
      相关资源
      最近更新 更多