Wrapping di enum da una libreria

7

Ho una dipendenza esterna che fornisce una libreria client che è soggetta a modifiche frequenti. Sto scrivendo una classe wrapper sulla parte superiore della libreria client in modo che tutte le modifiche rispetto a quella libreria siano contenute lì.

Questa libreria fornisce alcune enumerazioni necessarie per inviare richieste al client. Non voglio introdurre dipendenza da queste enumerazioni nel mio altro codice. C'è un modo per farlo senza scrivere enumerazioni di wrapper?

    
posta ayushgp 29.01.2018 - 13:33
fonte

2 risposte

1

Ho trovato un modo per definire e contenere queste modifiche in una classe wrapper. Ho creato le enumerazioni nella classe wrapper e definito un campo privato con l'enum che sta eseguendo il wrapping, un costruttore e un getter per ottenere la proprietà wrapped. Qualcosa del genere:

public enum FooWrapper {
    PROP1(Foo.PROP1),
    PROP2(Foo.PROP2);

    private Foo val;
    private FooWrapper(Foo val) {
        this.val = val;
    }

    public getFoo() {
        return this.foo;
    }
}
    
risposta data 30.01.2018 - 08:14
fonte
3

Come hai detto, non desideri introdurre una dipendenza da queste enumerazioni nel tuo codice (una scelta sensata, specialmente per le modifiche / librerie di terze parti che cambiano frequentemente).

Devi comunque avere un qualche tipo di mappatura nella tua classe "Wrapper" per quelle enumerazioni per inviare le tue richieste. A seconda di ciò che questi enumerati rispondono (e quanti ce ne sono) potresti avere diverse opzioni:

Se ci sono molti valori enum diversi

// ClientLib
enum FooDevices { DEVICE_F1, DEVICE_F2, ... DEVICE_F83 };
enum BarDevices { DEVICE_B1, DEVICE_B2, ... DEVICE_F61 };

// Wrapper
enum WrappedFooDevices { WRAPPED_DEVICE_F1 ... };
enum WrappedBarDevices { WRAPPED_DEVICE_B1 ... };

void sendRequest(WrappedFooDevices fooDevice, WrappedBarDevices barDevice);

Quindi usare una sorta di enum wrapper potrebbe essere l'unica scelta sensata (anche se hai ancora un po 'di leerway come avvolgi quei valori - lascia fuori quelli che non usi mai, ecc.)

Se ci sono solo alcuni valori di enum potresti essere in grado di creare una funzione separata per ciascuno.

// ClientLib
enum RequestType { FAST_REQUEST, SLOW_REQUEST, DATA_REQUEST };

// Wrapper
void sendFastRequest();
void sendSlowRequest();
void sendDataRequest();

In breve: come hai intuito, farai un qualche tipo di mappatura, ma potresti essere in grado di fare quella mappatura tramite chiamate di funzioni distinte (specialmente se le enumerazioni originali hanno l'odore del codice "valore della bandiera").

    
risposta data 29.01.2018 - 16:19
fonte

Leggi altre domande sui tag