Al lavoro abbiamo un'interfaccia che si sta gonfiando. L'interfaccia è progettata per essere facilmente implementata da un oggetto immutabile. Quindi sembra qualcosa del genere:
//there is no behavior here, just data access
interface DataBlock {
String name();
Integer idNumber();
Double score();
Instant time();
//...12 additional methods with arbitrary return types
}
Ci sono diversi punti nel codice in cui sarebbe utile rappresentare i valori all'interno di DataBlock come una mappa. Ad esempio, quando si implementa un costruttore o uno stabilimento.
La mia domanda iniziale era: Quale dovrebbe essere il tipo generico della mappa?
La codifica dei nomi dei metodi di interfaccia ha prodotto: Map<String, Object> dataBlockAsMap = Data
. Non mi piaceva questa opzione perché è facile digitare il nome del metodo in modo errato. Ad esempio, fallirà silenziosamente se qualcuno scrive map.get("iDNumber")
invece di map.get("idNumber")
.
Attualmente mi sto appoggiando a Map<DataBlockField, Object>
dove DataBlockField
è un enum con un tipo per ogni metodo nell'interfaccia. L'aspetto positivo di questo approccio è (1) che ogni valore enum può "conoscere" il suo tipo richiesto e (2) rende facile scrivere operazioni in batch come:
public static Map<DataBlockField, Object> asMap(DataBlock block) {
Map<DataBlockField, Object> map = new HashMap<>();
for(DataBlockField field : DataBlockField.values()) {
//enum helps extract a value from datablock
map.put(field, field.getFrom(block));
}
}
//and
public static String toString(DataBlock block) {
StringBuilder sb = new StringBuilder();
for(DataBlockField field : DataBlockField.values()) {
//enum helps extract a value from datablock
sb.append(field.getFrom(block));
}
}
La mia domanda è: l'introduzione di questa "interfaccia backed enum" è una buona idea? Chiedo perché potrei mancare qualcosa. In apparenza questa "enum backed interface" è vagamente simile al Builder Pattern. Tuttavia, vedo Builder a destra e a sinistra. Eppure non ho mai visto un enum scritto per rispecchiare i metodi in un'interfaccia.
Mi manca qualcosa qui?