Frage

Um meine NCSS -Anzahl einer Klasse zu verringern (~ 850), habe ich alle Methoden in ihre eigenen Klassen geteilt und um die Dinge zu erleichtern, erweitere ich eine abstrakte Klasse, die alle Helferfunktionen enthält.

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

Ich habe ca. 10 dieser Methodenklassen und möchte sie nur initialisieren, wenn eine der Methoden in der Haupt-/Basisklasse aufgerufen wird:

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

Ich habe versucht, in der MyBaseClass -Klasse eine Initialise -Funktion zu erstellen, die den Subtyp als Parameter akzeptiert und ein Objekt basierend auf seiner Klasse erstellt:

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

Aber es ist hässlich und ich muss eine pro Unterklasse haben.

Wie kann dies also "richtig" bewirken? Manchmal, wenn die Klasse aufgerufen wird, verwenden wir nur 1 oder 2 der Methoden, sodass ich nicht jedes Mal alle Unterklassen initialisieren muss.

War es hilfreich?

Lösung 2

Die Instanziierung der Klassen in Java ist billig. Wenn die Klassen in ihren Conctortors nichts Wesentliches tun, dann tun Sie es einfach

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

Optimieren Sie nicht, wo es nicht Nessary ist. Profilieren Sie Ihren Code vorher. Sie könnten überrascht sein, wie falsch Ihre Annahmen sind (ich weiß, dass ich viele Male war).

Andere Tipps

Es scheint mir, dass Sie es wirklich wollen, statische Methoden zu verwenden, anstatt abstrakte Helferklassen, vielleicht zusammen mit import static.

Auf diese Weise würde die Klasse (ES), die diese Methoden definiert, wie Sie möchten, erst dann initialisiert, wenn die Methoden tatsächlich aufgerufen werden.

Sie würden auch Ihre Erbschaftsstruktur im Allgemeinen nicht so einschränken, wo die Methoden definiert werden.

Dies setzt voraus, dass Sie natürlich keine Instanzdaten für diese Methoden verwenden. Aber aus dem Aussehen Ihres Beispielcodes scheint es nicht so zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top