Avvolgimento di una mappa con istanza o metodo statico

0

Ho un oggetto java.util.Map<String, Object> che contiene diversi tipi di valori. Non voglio lanciare ovunque io faccia un'operazione su questo. Per fare questo, ho creato diverse classi che avvolgono questa mappa e queste classi forniscono metodi di acquisizione diversi che restituiscono valori per chiavi diverse.

Ci sono due opzioni per questo:

public class Wrapper1 {
    private final Map<String, Object> map;

    public Wrapper1(Map<String, Object> map) {
        this.map=map;
    }

    public MyObject getMyObject() {
        return (MyObject)this.map.get("someKey");
    }
}

public class Wrapper2 {
    private Wrapper2() {
    }

    public static MyObject getMyObject(Map<String, Object> map) {
        return (MyObject)map.get("someKey");
    }
}

Come vedi, nel primo sto creando un'istanza di Wrapper1 e accedo all'istanza MyObject per metodo di istanza. In secondo luogo, fornisco la mappa a un metodo statico e accedo alla stessa istanza MyObject.

Quale preferirai di più e perché? Inoltre se questa è una cattiva pratica, per favore fatemelo sapere. Grazie.

    
posta GokcenG 09.05.2014 - 22:52
fonte

3 risposte

1

Questa è ancora una pessima pratica dato che continui a fare casting.

Se vuoi memorizzare diversi tipi nella mappa, allora la possibilità è alta che tutti questi oggetti condividano un comportamento comune. In questo caso, tutti questi devono implementare l'interfaccia che definisce questo comportamento in modo da poterli memorizzare in modo digitato e senza eseguire il cast nella stessa mappa.

Se non condividono lo stesso comportamento, allora perché archiviarli tutti nella stessa mappa? Avranno significati diversi e quindi dovrebbero essere salvati in mappe diverse o creare una classe che abbia diverse mappe di questi tipi come membri.

L'ultimo caso è che viene fornito l'array e non è possibile modificare il modo in cui gli oggetti vengono salvati. In questo caso in realtà preferirei una combinazione di entrambe le opzioni. Metti il metodo statico nella classe sopra. In questo modo puoi comunemente usare la funzione statica per ottenere il tuo oggetto senza prima creare un'istanza. Se sai che dovrai chiamare questo metodo spesso, puoi creare un oggetto che passa la mappa e non dovrai sempre passare la mappa ogni volta che vuoi ottenere il tuo oggetto. Questo è legato all'utilizzo del pattern del metodo fabric o del currying / partial application utilizzato nella programmazione funzionale (nel qual caso il solo metodo statico sarebbe sufficiente).

Si noti tuttavia che sarebbe opportuno verificare in qualche modo se l'oggetto che si ottiene dalla mappa soddisfi le proprie aspettative (se possibile) e, in caso contrario, generare un'eccezione.

    
risposta data 10.05.2014 - 01:04
fonte
0

Personalmente preferirei la prima opzione, principalmente perché ti darebbe la possibilità di sovrascrivere i metodi del wrapper o aggiungere ulteriori metodi "getMyObject" con una classe ereditata, se necessario. E in senso stretto, la seconda opzione non sarebbe davvero un "involucro". È solo una classe con metodi di utilità statici.

Tuttavia, qualunque opzione tu decida di adottare, esegui sicuramente il controllo dei tipi nei metodi "getMyObject" prima di trasmettere.

    
risposta data 24.05.2014 - 07:19
fonte
0

Dipende davvero se prevedi di avere tipi di oggetto MyObject , MyObject2 , ... MyObjectN memorizzati in una singola istanza di mappa o più mappe che memorizzano MyObject .

Nel primo caso con più tipi di oggetto, avrebbe senso scegliere Wrapper1 perché è possibile mantenere la mappa in Wrapper1 e non sono necessari parametri per il metodo che lo recupera. In quest'ultimo caso con più istanze di mappe, Wrapper2 ha senso; altrimenti avresti anche bisogno di più istanze di Wrapper1 .

    
risposta data 24.05.2014 - 07:36
fonte

Leggi altre domande sui tag