Spring + Mongo + Generics + Flexibility

El siguiente código no funciona (por supuesto), porque la línea marcada no se compila:

MyClass {
    //singleton stuff
    private static MyClass instance;
    private MyClass () {}
    public static MyClass getInstance() {
        if(instance==null) {
            instance = new MyClass ();
        }
        return instance;
    }

    // method creating problems
    public NonGenericSuperClassOfGenericClass create(Class<?>... classes) {
        if(someCondition)
             return new GenericClass<classes[0],classes[1]>; // DOES NOT COMPILE
        else
             return new OtherGenericClass<classes[0]>;
    }
}

Por lo tanto, en realidad no sé si "crear" volverá

GenericClass<classes[0],classes[1]>

o

OtherGenericClass<classes[0]>

que tienen diferentes números de parámetros.

Esto sucede porque estoy usando Spring y planeo usar MongoDB , pero en el futuro podría necesitar cambiar a algo diferente (por ejemplo, Hibernate).

La clase GenericClass es algo así como:

 GenericClass<PersistetType1, Long> 

o

 GenericClass<PersistentType2, Long>

donde PersistentType1 / 2 son clases que finalmente necesito almacenar en la base de datos, mientras que GenericClass es una especie de Proxy para acceder a las API de Mongo. De hecho, se ve así:

  public MongoTemplate getTemplate();
  public void save(T toInsert);
  public List<T> select(Query selectionQuery);
  public T selectById(ID id);
  public WriteResult update(Query selectionQuery, Update updatedAttributes);
  public void delete(T toRemove);
  public void delete(Query selectionQuery);

¿Ahora que? De los Controladores (o Entidad, si eres exigente) necesito instanciar el repositorio e invocar cualquier método. Esto hace que los Controladores se acoplen con MongoDB, es decir, tienen que crear una instancia explícita de tal GenericClass, que en realidad se llama MongoRepository y depende estrictamente de Mongo (de hecho, es un genérico con exactamente dos "grados de libertad").

Entonces, decidí crear MyClass, que es un proxy adicional que aísla los Controladores. De esta manera, Controller puede obtener la instancia única de MyClass y dejar que cree una nueva instancia del repositorio apropiado. En particular, cuando "alguna condición" es verdadera, significa que queremos usar MongoRepository (cuando es falso, tal vez, la necesidad de instanciar un proxy Hibernate, es decir, HibernateRepository). Sin embargo, MongoRepository es genérico, por lo tanto, requiere alguna forma de instanciación, que esperaba pasar como parámetro.

Desafortunadamente, los genéricos se resuelven en tiempo de compilación, por lo que no funcionan para mí, supongo.

¿Cómo puedo arreglar eso?

Respuesta 1

Me encanta jFugue, pero no puedo controlar el volumen de un patrón. Estos 2 patrones, en mi computadora portátil, se reproducen al mismo volumen (en el papel, el segundo debería ser dos veces más fuerte que el primero): Patrón ...

Utilizamos el generador de GUI de NetBeans para crear nuestros formularios visuales. Intentamos que sean compatibles con JavaBean para que podamos arrastrar y soltar componentes en la pantalla. Sin embargo, a veces esto se convierte en ...

¿Hay alguna forma de usar "API de Java de Google Sheet" con la clave API no con OAuth que se proporciona en sus ejemplos https://developers.google.com/sheets/api/quickstart/java Sé que puede usar la solicitud HTTP. .

Estoy leyendo y probando Quartz Scheduler y parece realmente una plataforma muy buena y fácil de usar. Estaba leyendo acerca de varios oyentes proporcionados por Quartz para Jobs, Triggers y ...