Pregunta

En un esfuerzo por reducir mi recuento de NCSS de una clase (~ 850), he dividido todos los métodos en sus propias clases y para facilitar las cosas, extiendo una clase abstracta que contiene todas las funciones de ayuda.

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

Tengo aproximadamente 10 de estas clases de métodos y me gustaría inicializarlas cuando se llama uno de los métodos en la clase principal/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);
    }
}

He intentado crear una función inicializada en la clase MyBasecLass que acepta el subtipo como parámetro y crear un objeto basado en su clase:

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

Pero es feo y tengo que tener uno por subclase.

Entonces, ¿cuál es la forma "correcta" de hacer esto? A veces, cuando se llama a la clase, solo usaremos 1 o 2 de los métodos, por lo que no quiero tener que inicializar todas las subclases cada vez.

¿Fue útil?

Solución 2

Las clases de instancia en Java son baratas. Si las clases no están haciendo nada sustancial en sus contratores, entonces hazlo

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

No optimice dónde no es Nessesary. Perfente su código antes. Es posible que se sorprenda lo equivocado que están sus asumidos (sé que fui muchas veces).

Otros consejos

Me parece que lo que realmente quieres es usar métodos estáticos en lugar de clases de ayudantes abstractos, tal vez junto con import static.

De esa manera, la clase (ES) que define esos métodos, como desee, solo se inicializaría una vez que los métodos se llamen realmente.

Tampoco limitaría su estructura de herencia en general a dónde se definen los métodos.

Eso supone que no utiliza ningún datos de instancia para esos métodos, por supuesto; Pero por el aspecto de su código de muestra, no parece así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top