Metodi astratti usati come metodi statici in java?

0

Nel tentativo di scrivere del codice generico mi trovo a mettere, nella mia classe astratta, un metodo che restituisce alcune informazioni statiche su come la classe dovrebbe essere trattata. Questo metodo non utilizza dati di stato e sarebbe statico, tranne che i metodi astratti statici non sono consentiti. È un odore di codice? c'è qualcosa che dovresti fare per evitarlo?

Non ho ancora scritto il vero codice. Ecco un rapido esempio, concettualmente. Piccola programmazione slopy da fare per renderla una lettura veloce. fondamentalmente un modo per il codice di restituire informazioni al modello, in questo caso, su come dovrebbe essere trattato all'interno delle funzioni generiche del modello. Supponiamo che l'enumerazione memorizzi qualsiasi stato di configurazione in questo caso.

public abstract modelObject{

    public abstract ModelGroup getModelGroup;

    public final void addToModel(){
        Model.store(this.getModelGroup, this);
    }
}


public class myObject extends modelObject{
    public ModelGroup getModelGroup(){
        return ModelGroup.MyGroup;
    }
}

public class DifferentClass extends ModelObject{
    public ModelGroup getModelGroup(){
        return ModelGroup.differentGroup;
    }

}

    
posta dsollen 03.05.2013 - 23:41
fonte

1 risposta

0

Preferibilmente, piuttosto che fornire proprietà che specificano come l'oggetto dovrebbe essere trattato, il comportamento dipendente dalla classe dovrebbe invece essere incapsulato all'interno di un metodo astratto. Ad esempio, utilizzare:

obj.doSomething(); // Abstract method - subclasses override with appropriate behavior

invece di:

if(obj.getModelGroup() == ModelGroup.MyGroup) {
    doSomethingWith(obj); // Behavior specific to one subclass
} else {
    doSomethingElseWith(obj); // Behavior specific to another subclass
}

Detto questo, ci sono casi perfettamente legittimi in cui gli implementatori di un metodo potrebbero non utilizzare lo stato specifico dell'istanza.

Ad esempio, considera java.sql Interfaccia .Driver (non è una classe astratta, ma potrebbe facilmente esserlo). Se si dispone di una classe separata per ogni tipo di driver, i suoi metodi probabilmente non richiedono alcuno stato specifico dell'istanza. I metodi jdbcCompliant , getMinorVersion e getMajorVersion probabilmente restituiscono costanti codificate. I metodi acceptsURL e connect probabilmente hanno un comportamento che non è specifico dell'istanza.

In breve: dipende . Non utilizzare lo stato dell'istanza in un'implementazione del metodo astratto non è intrinsecamente sbagliato; tuttavia, in alcuni casi potrebbe indicare che il tuo codice potrebbe trarre vantaggio dalla ristrutturazione.

    
risposta data 04.05.2013 - 01:40
fonte

Leggi altre domande sui tag