Domanda

Nel tentativo di ridurre il conteggio del mio NCSS di una classe (~ 850), ho diviso tutti i metodi nelle loro classi e per rendere le cose più facili, estengo una classe astratta che contiene tutte le funzioni di supporto.

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

Ho circa 10 di queste classi di metodi e vorrei inizializzarle solo quando si chiama uno dei metodi nella classe principale/base:

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

Ho provato a creare una funzione iniziale nella classe MyBaseClass che accetta il sottotipo come parametro e crea un oggetto in base alla sua classe:

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

Ma è brutto e devo averne uno per sottoclasse.

Allora, qual è il modo "corretto" per farlo? A volte quando viene chiamata la classe, useremo solo 1 o 2 dei metodi, quindi non voglio inizializzare tutte le sotto-class ogni volta.

È stato utile?

Soluzione 2

Le lezioni di istanza di Java sono economiche. Se le lezioni non fanno nulla di sostanziale nei loro controdri, allora fai

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

Non ottimizzare dove non è Nessesario. Profila il tuo codice prima. Potresti essere sorpreso di quanto siano sbagliate le tue presunte assunzioni (so di essere molte volte).

Altri suggerimenti

Mi sembrerebbe che ciò che vuoi veramente sia usare metodi statici piuttosto che le classi di aiuto astratte, forse insieme a import static.

In questo modo, le classi (ES) che definiscono tali metodi, come desideri, sarebbero inizializzate solo una volta chiamati i metodi.

Inoltre, non limiteresti la tua struttura di eredità in generale a dove sono definiti i metodi.

Ciò presuppone che non si utilizzi dati di istanza per questi metodi, ovviamente; Ma dall'aspetto del tuo codice di esempio, non sembra così.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top