Question

Dans un effort pour réduire mon nombre de NCS d'une classe (~ 850), j'ai divisé toutes les méthodes en leurs propres classes et pour rendre les choses plus faciles, j'étends une classe abstraite qui contient toutes les fonctions d'assistance.

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

J'ai environ 10 de ces classes de méthode et je souhaite les initialiser uniquement que lorsque l'une des méthodes de la classe principale / de base est appelée:

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

J'ai essayé de créer une fonction initialisée dans la classe MyBasEClass qui accepte le sous-type comme un paramètre et de créer un objet basé sur sa classe:

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

Mais c'est moche et je dois en avoir un par sous-classe.

Alors, quelle est la façon "correcte" de faire cela? Parfois, lorsque la classe est appelée, nous n'utiliserons que 1 ou 2 des méthodes, donc je ne veux pas avoir à initialiser toutes les sous-classes à chaque fois.

Était-ce utile?

La solution 2

Les cours instanciés en Java sont bon marché. Si les classes ne font rien de substantiel dans leurs contrators, faites simplement

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

N'optimisez pas où ce n'est pas nessesaire. Profitez votre code avant. Vous pourriez être surpris de la tâche de vos suppositions (je sais que je l'étais plusieurs fois).

Autres conseils

Il me semble que ce que vous voulez vraiment, c'est utiliser des méthodes statiques plutôt que des classes abstraites auxiliaires, peut-être avec import static.

De cette façon, la ou les classes de définition de ces méthodes ne seraient, comme vous ne le souhaitez, qu'une fois les méthodes réellement appelées.

Vous ne limitez pas non plus votre structure d'héritage en général à la définition des méthodes.

Cela suppose que vous n'utilisez aucune donnée d'instance pour ces méthodes, bien sûr; Mais à partir de l'apparence de votre exemple de code, cela ne semble pas ainsi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top