Accedi a configurazioni non simili con un oggetto di accesso ai dati

0

Attualmente sto lavorando a un piccolo progetto e spero di migliorare con la progettazione del software. Ho una soluzione, ma penso che ci sia un modo molto migliore di cui non sono a conoscenza.

Il problema è che ogni configurazione ha bisogno di un tipo diverso come input e restituisce un tipo diverso. C'è un modo per renderlo più pulito?

Al momento ho 3 classi:

IConfig come interfaccia con un sacco di generici che non mi piacciono molto:

package de.config;


public interface IConfig {
    void load();
    //I use this so that the right Config class can be found in a hashmap, see ConfigDAO
    <T> Class<T> dealsWith();
    <V> boolean add(V value);
    <K,V> boolean set(K id,V newValue);
    <V,K> V get(K id);


}

ConfigDAO dovrebbe delegare una richiesta alla giusta configurazione:

package de.config;

import java.util.Arrays;
import java.util.HashMap;

public class ConfigDAO
{
    private static ConfigDAO instance;
    private HashMap<Class<?>,IConfig> configsHM = new HashMap<>();
    private IConfig[] configsAr = {new ExpConfig(),new SettingsConfig()};


    public static ConfigDAO getInstance() {
        if(instance==null)
            return instance = new ConfigDAO();
        return instance;
    }

    private ConfigDAO(){
        loadConfig();
    }

    private void loadConfig(){
        Arrays.stream(configsAr).forEach(x->configsHM.put(x.dealsWith(),x));
    }

    public <V,I> V get(Class<?> type,I item){
        IConfig config = configsHM.get(type);
        return (config == null) ? null : config.get(item);
    }
}

E un esempio di classe Config (Niente implementato):

package de.config;


import de.models.IEntity;

public class ExpConfig implements IConfig{

    @Override
    public void load() {

    }

    @Override
    public <T> Class<T> dealsWith() {
        return (Class<T>) IEntity.class;
    }

    @Override
    public <V> boolean add(V value) {
        return false;
    }

    @Override
    public <K, V> boolean set(K id, V newValue) {
        return false;
    }

    @Override
    public <V,K> V get(K id) {
        return null;
    }
}

Qualsiasi suggerimento è benvenuto!

Grazie in anticipo, Nordiii

    
posta Nordiii 23.02.2018 - 22:47
fonte

0 risposte

Leggi altre domande sui tag