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