Se utilizzare enum vs map vs file di configurazione?

2

Ho ~ 30 risorse ognuna avente ~ 10 attributi. Voglio memorizzare alcune informazioni su ciascun attributo. Es: la sua molteplicità, RW (lettura / scrittura), RO (sola lettura), longName, shortname.

Quindi stavo pensando di memorizzarlo in un Enum come:

public enum Attributes {

    U_RESOURCETYPE(true, "RW", "resourceType", "rt"),
    U_RESOURCEID(false, "RO", "resourceID","ri"),
    //...
}

Ma questo ha portato a 300 costanti (30 risorse * 10 attributi).

Potrei anche usare un file di configurazione o Singleton Enum con una mappa come membro.

Qual è il modo migliore per raggiungere questo obiettivo?

    
posta Siddharth Trikha 03.02.2016 - 12:24
fonte

2 risposte

1

Presumo che queste siano davvero delle costanti, non dei valori di configurazione, cioè non cambiano tra le invocazioni o le distribuzioni.

In tal caso lo memorizzerei nei file Java - nessun parsing complicato dal file di configurazione, puoi sfruttare la sicurezza del tipo ecc.

Il tuo approccio con l'enumerazione va bene per molti casi, ma il problema qui è il numero di attributi - il costruttore di enum contiene troppi argomenti, quindi è facile perdersi in essi, cambiare l'ordine degli argomenti ecc.

Nel tuo caso probabilmente creerei qualcosa del genere:

class Attributes {
    public static Attributes U_RESOURCETYPE = new Attributes()
            .setMultiplicity(true)
            .setRw("RW")
            .setLongName("resourceType")
            .setShortName("rt");

    public static Attributes U_RESOURCEID = new Attributes()
            .setMultiplicity(true)
            .setRw("RO")
            .setLongName("resourceID")
            .setShortName("ri");

    private boolean multiplicity;
    private String rw;
    private String longName;
    private String shortName;

    private Attributes() {}

    private Attributes setMultiplicity(boolean multiplicity) {
        this.multiplicity = multiplicity;
        return this;
    }

    private Attributes setRw(String rw) {
        this.rw = rw;
        return this;
    }

    private Attributes setLongName(String longName) {
        this.longName = longName;
        return this;
    }

    private Attributes setShortName(String shortName) {
        this.shortName = shortName;
        return this;
    }
}

Ti dà sicurezza e chiarezza, ma è un po 'più laborioso ...

    
risposta data 03.02.2016 - 12:45
fonte
0

Se disponi di molte proprietà di configurazione su più applicazioni, la mia raccomandazione sarebbe di creare un semplice CCM . altrimenti è meglio usare il file di configurazione. Ecco il modo più semplice per caricarli,

Properties result = null;

  String propertyFilePath = ""//<PATH to config file>; you can manipulate with String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

  InputStream inputStream = null;
  try {
    inputStream = new FileInputStream(propertyFilePath);
    result = new Properties();
    result.load(inputStream);
  } catch (FileNotFoundException e) {
    LOGGER.warn("Property file not found. Exception: {}",e);
  } catch (IOException e) {
    LOGGER.warn("IO Exception while reading Property File. Exception: {}",e);
  }finally {
    close(inputStream);
  }

Quindi puoi semplicemente leggere una proprietà come result.getProperty("prop1");

Puoi racchiuderlo come un singleton e chiamare l'istanza per tutte le tue proprietà.

close è un metodo util per chiudere un flusso,

public static void close(Closeable c) {
        if (c == null) return;
        try {
            c.close();
        } catch (IOException e) {
            LOGGER.warn("Exception while closing the stream, {}",e);
        }
    }
    
risposta data 09.02.2016 - 07:09
fonte

Leggi altre domande sui tag