Pergunta

Em um esforço para reduzir minha contagem de NCSs de uma classe (~ 850), divida todos os métodos em suas próprias classes e, para facilitar as coisas, estendo uma classe abstrata que mantém todas as funções do ajudante.

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;
    }
}

Eu tenho aproximadamente 10 dessas classes de método e gostaria de inicializá -las apenas quando um dos métodos na classe principal/base for chamado:

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);
    }
}

Tentei criar uma função inicial na classe MyBaseClass que aceita o subtipo como um parâmetro e criar um objeto com base na classe:

private void initAccount() {
    if (ad == null) {
        ad = new AccountData();
    }
}

Mas é feio e eu tenho que ter um por subclasse.

Então, qual é a maneira "correta" de fazer isso? Às vezes, quando a classe é chamada, usaremos apenas 1 ou 2 dos métodos, por isso não quero ter que inicializar todas as subclasses a cada vez.

Foi útil?

Solução 2

As aulas instantinas em Java é barato. Se as aulas não estive

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

Não otimize onde não é nesseary. Profile seu código antes. Você pode estar surpreso com o quão erradas estão suas supostas (eu sei que eu fui muitas vezes).

Outras dicas

Parece -me que o que você realmente quer é usar métodos estáticos em vez de classes de auxiliares abstratas, talvez junto com import static.

Dessa forma, as classes definindo esses métodos, como desejar, só seriam inicializadas quando os métodos forem realmente chamados.

Você também não limitaria sua estrutura de herança em geral, onde os métodos são definidos.

Isso supõe que você não use nenhum dado de instância para esses métodos, é claro; Mas pela aparência do seu código de amostra, não parece assim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top