Envolviendo enumeraciones de una biblioteca

7

Tengo una dependencia externa que proporciona una biblioteca cliente que está sujeta a cambios con frecuencia. Estoy escribiendo una clase contenedora en la parte superior de la biblioteca del cliente para que todos los cambios con respecto a esa biblioteca estén contenidos allí.

Esta biblioteca proporciona algunas enumeraciones que son necesarias para enviar solicitudes al cliente. No quiero introducir la dependencia de estas enumeraciones en mi otro código. ¿Hay alguna manera de hacer esto sin escribir también enums de envoltura?

    
pregunta ayushgp 29.01.2018 - 13:33

2 respuestas

1

Encontré una forma en que puedo definir y contener estos cambios en una clase de envoltorio. Creé enums en la clase wrapper y definí un campo privado con la enumeración que está envolviendo, un constructor y un captador para obtener la propiedad envuelta. Algo como esto:

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

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

    public getFoo() {
        return this.foo;
    }
}
    
respondido por el ayushgp 30.01.2018 - 08:14
3

Como ha dicho, no desea introducir una dependencia en esas enumeraciones en su código (una opción sensata, especialmente para las bibliotecas / las bibliotecas de terceros que cambian con frecuencia).

Aún necesitas tener algún tipo de mapeo en tu clase "Wrapper" a esas enumeraciones para enviar tus solicitudes. Dependiendo de lo que representen esos enumerados (y cuántos hay) puede tener diferentes opciones:

Si hay muchos valores de enumeración diferentes

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

Luego, usar algún tipo de envoltura de enumeración puede ser la única opción sensata (aunque todavía tienes alguna manera de leer cómo envolver esos valores, omite aquellos que nunca usas, etc.)

Si solo hay unos pocos valores de enumeración, puedes crear una función separada para cada uno.

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

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

En resumen: Como ha adivinado, se obtendrá algún tipo de asignación, pero es posible que pueda realizar esa asignación a través de distintas llamadas de función (especialmente si las enumeraciones originales tienen el olor del código de "valor de marca").

    
respondido por el CharonX 29.01.2018 - 16:19

Lea otras preguntas en las etiquetas