Consejos sobre modelos con genéricos en Java -- java campo con generics camp codereview Relacionados El problema

Advice on modelling with generics in Java


4
vote

problema

Español

Uso Case

La biblioteca de terceros con la que estoy trabajando implementa su modelo de datos de esta manera.

  Interface   - Implementation (24 different implementations)      - Interface          - Implementation (variable number of implementations)               - etc...   

Lamentablemente, ninguna de las interfaces tiene definiciones para cualquiera de los métodos comunes en las implementaciones ... que ha sido interesante. Además, muchas de las implementaciones vienen en dos sabores: 9988777665544332 y optional . Por alguna razón, esto no se implementó como una bandera, pero como dos clases separadas.

Esto ha llevado a un código interesante, lo que siento que tiene algún código, pero no estoy seguro de cómo mejorarlo.

Código

Este código esencialmente obtiene una lista profundamente anidadosa de artículos enterrados dentro de esta biblioteca de terceros. Curiosamente, todas las implementaciones eventualmente producirán esta lista de artículos con el mismo frijol. Dado que todas las implementaciones son esencialmente lo mismo, lo moví una clase abstracta:

  public abstract class AbstractAdapter<ChoiceClass, OptionalClass, RequiredClass, EntryBeanClass, BeanClass> {      Class<ChoiceClass> choiceClass;     Class<OptionalClass> optionalClass;     Class<RequiredClass> requiredClass;     Class<EntryBeanClass> entryBeanClass;     Class<BeanClass> beanClass;      {         initializeClasses();     }      abstract void initializeClasses();     abstract List<ChoiceClass> optionalToEntry(OptionalClass optional);     abstract List<ChoiceClass> requiredToEntry(RequiredClass required);     abstract BeanClass entryToBean(EntryBeanClass entry);      List<BeanClass> getCcdBeans(MagicRequestBean requestBean) {         List<Component3Choice> components = requestBean.getComponent();          List<ChoiceClass> entries = Lists.newArrayList();         for (Component3Choice component : components) {             if (optionalClass.isInstance(component)) {                 entries = optionalToEntry(optionalClass.cast(component));                 break;             }             if (requiredClass.isInstance(component)) {                 entries = requiredToEntry(requiredClass.cast(component));                 break;             }         }          return entries.stream()                 .filter(entryBeanClass::isInstance)                 .map(entryBeanClass::cast)                 .map(this::entryToBean)                 .collect(Collectors.toList());     } }   

Preguntas

  • ¿Hay una solución más limpia para modelar este adaptador?

Se apreciaría cualquier otro consejo para mejorar este código.

Original en ingles

Use Case

The third party library that I am working with implements its data model in this fashion.

Interface   - Implementation (24 different implementations)      - Interface          - Implementation (variable number of implementations)               - etc... 

Unfortunately, none of the interfaces have definitions for any of the common methods in the implementations... which has been interesting. As well, many of the implementations come in two flavours - required and optional. For whatever reason, this was not implemented as a flag, but as two separate classes.

This has lead to some interesting code, which I feel has some code smell it, but I'm not sure how to improve it.

Code

This code essentially fetches a deeply nested list of items buried inside this third party library. Oddly, all implementations will eventually produce this list of items all with the same bean. Since all implementations are essentially the same, I moved it an abstract class:

public abstract class AbstractAdapter<ChoiceClass, OptionalClass, RequiredClass, EntryBeanClass, BeanClass> {      Class<ChoiceClass> choiceClass;     Class<OptionalClass> optionalClass;     Class<RequiredClass> requiredClass;     Class<EntryBeanClass> entryBeanClass;     Class<BeanClass> beanClass;      {         initializeClasses();     }      abstract void initializeClasses();     abstract List<ChoiceClass> optionalToEntry(OptionalClass optional);     abstract List<ChoiceClass> requiredToEntry(RequiredClass required);     abstract BeanClass entryToBean(EntryBeanClass entry);      List<BeanClass> getCcdBeans(MagicRequestBean requestBean) {         List<Component3Choice> components = requestBean.getComponent();          List<ChoiceClass> entries = Lists.newArrayList();         for (Component3Choice component : components) {             if (optionalClass.isInstance(component)) {                 entries = optionalToEntry(optionalClass.cast(component));                 break;             }             if (requiredClass.isInstance(component)) {                 entries = requiredToEntry(requiredClass.cast(component));                 break;             }         }          return entries.stream()                 .filter(entryBeanClass::isInstance)                 .map(entryBeanClass::cast)                 .map(this::entryToBean)                 .collect(Collectors.toList());     } } 

Questions

  • Is there a cleaner solution to model this adapter?

Any other advice to improve this code would be appreciated.

     
   
   

Lista de respuestas


Relacionados problema

1  Función de aplanamiento de la matriz genérica  ( Generic array flattening function ) 
Con la ayuda de la comunidad de CodereView, he escrito una función para aplanar una matriz anidada genérica. Lo tengo escrito de varias maneras, pero quiere c...

2  Organización de código de deserialización de estructura variante  ( Variant structure deserialization code organization ) 
En mi proyecto, trabajo con objeto COM a través de Questions8 . Com Objeto Devoluciones Puntero en Estructura Questions9 , que eché como Sections0 y luego...

1  Java Gennics, convertir la lista anidada a la matriz  ( Java generics convert nested list to array ) 
Tengo que interactuar con un código antiguo usando matrices anidadas, por lo que tengo que convertir mis listas anidadas a las matrices anidadas. Cualquier id...

1  Implementación rápida equivalente a colecciones  ( Quicksort implementation equivalent to collections sort ) 
Aquí está mi ir a comprender genéricos, 99887776655443312 S y for3 S, así como en los límites de tipo. Creo que lo hice tan cerca de for4 como sea posib...

7  Implementar una secuencia de Fibonacci genérica en óxido sin usar copia rasgo  ( Implement a generic fibonacci sequence in rust without using copy trait ) 
Estoy tratando de aprender a óxido y soy un principiante. ¿Cómo se hace frente a la implementación de una versión genérica de la secuencia FIBONACCI sin usar ...

4  Implementación de Singleton usando genéricos  ( Singleton implementation using generics ) 
Hice esto como un ejercicio solo para practicar / mejorar el uso de genéricos. Independiente de lo útil que es esta implementación de un singleton, ¿cómo es...

7  Array Genérico  ( Generic arraylist ) 
¿Puede alguien recomendar mejoras al método de compresa ()? public class ArrayList<E> { private Object[] array; public static final int DEFAULT_SIZE = 20...

3  Genéricos anulables - implementando secuencialSearchst en C #  ( Nullable generics implementing sequentialsearchst in c ) 
Para fines de aprendizaje, estoy implementando cierto código de SEDEDWICK & AMP; Los algoritmos de Wayne, cuarta edición . Debido a las características del...

7  Clase de valor almacenado en caché genérico imitando perezosos <t>  ( Generic cached value class mimicking lazyt ) 
Antes de escribir esto, busqué y encontré una serie de soluciones que hacen uso de un proveedor de almacenamiento en caché para manejar un conjunto de artícul...

8  Aplanamiento recursivo de secuencias rápidas  ( Recursive flattening of swift sequences ) 
en aplanar Obtenga todos los controles infantiles de cierto tipo en una UIVIE , se discutieron los métodos para Recursivamente aplanar una estructura similar...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos