Quale modello si dovrebbe utilizzare per interpretazioni multiple degli stessi dati?

1

Ho una serie di informazioni che sono in grado di leggere come dati grezzi che corrispondono a diverse grandezze fisiche a seconda del dispositivo che ha fornito tali informazioni. Ogni dispositivo contiene la stessa quantità di dati e gli stessi tipi, solo diversi campi sono interpretati in modo diverso. Ecco come l'ho implementato finora:

public abstract class SuperData {
    int voltage1;
    int voltage2;

    SuperData(int v1, int v2) {
        voltage1 = v1;
        voltage2 = v2;
    }

    public int getVoltage1 { return voltage1; }
    public int getVoltage2 { return voltage2; }
}

public class CarAData extends SuperData {
    CarAData(int v1, int v2) { super(v1, v2); }

    public int getKeyVoltage { return getVoltage1(); }
    public int getLightVoltage { return getVoltage2(); }
}

public class CarBData extends SuperData {
    CarAData(int v1, int v2) { super(v1, v2); }

    public int getStarterVoltage { return getVoltage1(); }
    public int getCigarretteVoltage { return getVoltage2(); }
}

Questo è solo un esempio banale; in realtà si tratta di circa 60 campi che sono solo un array di byte proveniente da Bluetooth. Sto utilizzando una factory per creare l'oggetto corretto in base a un altro flusso di dati, ma il problema è che richiede l'utilizzo di instanceof in fondo alla strada per sapere quale metodo chiamare.

Quindi quale modello è il modo migliore per rappresentare i dati che hanno significati diversi?

    
posta JayCle 21.10.2015 - 01:26
fonte

1 risposta

1

Stai descrivendo un Record Variant o Unione discriminata. Non sono supportati direttamente in Java, ma come hai già scoperto puoi simularli con la classe gerarchie.

instanceof non dovrebbe essere un problema. È un po 'di riflessione voodoo, ma devi farlo una sola volta per record se lanci il tuo oggetto sul Type corretto una volta che lo identifichi. Se il riflesso ti infastidisce, includi un metodo "Tag" nella classe base che restituisce un descrittore di qualche tipo.

È un peccato che tu non stia lavorando in C #; Le strutture dell'Unione C-like sono supportate direttamente in quella lingua.

    
risposta data 21.10.2015 - 02:50
fonte

Leggi altre domande sui tag