2016-06-21 4 views
0

Je veux généraliser un morceau répétitif de code Java pour beaucoup d'entités similaires (~ 40-50) (dans mon cas, cette pièce est l'indexation de fichiers avec ces entités).Java traitant beaucoup d'usines de béton

J'ai essayé de le refactoriser avec une méthode générique, mais, par conséquent, j'ai un constructeur de classe générique qui est apparemment interdit en Java. Pour éviter cela, j'ai mis en place un modèle d'usine abstrait et voici ce que j'ai.

public <E extends CMObject, F extends IndexedFile<E>> F indexFile(CMFactory<E, F> factory) { 
    F items; 
    ByteBuffer[] buffs; 

    // ...filling buffers... 

    items = factory.makeFile(buffs); // as I cannot do items = new F(buffs) 

    return items; 
} 

public CityFile getCities() { 
    return indexFile(new CityFactory()); 
} 

public ContinentFile getContinents() { 
    return indexFile(new ContinentFactory()); 
} 
// a lot of more 

Cela résout un problème de création d'une instance de classe générique. Cependant, je suis maintenant confronté à la tâche de créer une usine concrète pour chaque entité qui semble être un travail monotone car ils se ressemblent tous. La question est: y a-t-il un moyen d'automatiser la création de telles usines? Ou peut-être existe-t-il un autre modèle qui peut au moins rendre une telle création moins douloureuse?

J'ai essayé d'utiliser le refactor de remplacement de méthode d'usine d'IntelliJ IDEA, mais cela ne m'a pas aidé.

Répondre

3

Depuis votre CMFactory est presque une interface fonctionnelle, vous pouvez utiliser les poignées constructeur au lieu de mettre en œuvre CMFactory pour chaque classe concrète:

Faire CMFactory une interface:

public interface CMFactory<E extends CMObject, F extends IndexedFile<E>> { 
    public abstract F makeFile(ByteBuffer[] buff); 
} 

puis écrire

public CityFile getCities() { 
    return indexFile(CityFile::new); 
} 

Vous pouvez même ignorer CMFactory et utiliser java.util.Function:

public <E extends CMObject, F extends IndexedFile<E>> F indexFile(Function<ByteBuffer[],F> factory) { 
    ByteBuffer[] buffs; 
    // ...filling buffers... 
    return factory.apply(buffs); 
}