Alternativa non nulla a Void (tipo di unità Java)

3

Ho un tipo map-like SmurfMap<K, V> che in determinati contesti io uso come un set-like SmurfMap<K, Void> . I dettagli di implementazione vietano che i valori della mappa siano null , quindi non posso effettivamente usare Void come tipo di unità . Esistono alternative non nulle a Void in JCL o Guava?

Tipi considerati e non ancora respinti:

  • new singleton enum Unit
  • Class<Void>
  • TypeToken<Void>
  • Object

EDIT SmurfMap<K, V> non implementa java.util.Map . La struttura dei dati che supporta un SmurfMap è di dimensioni da terabyte a petabyte.

    
posta Robert Cooper 26.05.2015 - 18:15
fonte

3 risposte

4

Se non hai bisogno dei valori, non usare una mappa. Utilizza un Set . È una raccolta che non contiene elementi duplicati (di equals e hashCode ) e ha il controllo di appartenenza O(1) .

Se il codice è impossibile strutturare in un modo che utilizza un set, e deve usare una mappa *, allora di queste opzioni creo un tipo singleton Unit . Lo sceglierei perché come valore di mappa, fa il miglior lavoro comunicando che il valore non è utilizzato. Un Map<T, Boolean> implica che la validità booleana dei valori sia importante e dovrebbe essere verificata.

* Questo indica un odore di codice piuttosto sgradevole, e dovresti esaminare di più il tuo design.

    
risposta data 26.05.2015 - 18:49
fonte
1

Hai detto nei commenti che "SmurfMap è un'astrazione simile a una mappa su una struttura dati di dimensioni petabyte". Ciò significa che lo spazio di archiviazione dovrebbe essere una preoccupazione importante.

Dato questo sfondo, userei un tipo personalizzato con un solo valore, che serializza a zero byte. Passare attraverso l'implementazione SmurfMap per assicurarsi che ciò comporti effettivamente la minore quantità di spazio di archiviazione necessario.

    
risposta data 28.04.2017 - 12:48
fonte
0

Due tecniche alternative da considerare:

  • Utilizza un tipo con l'argomento generico Void rimosso. Invece di Callable<Void> , utilizza Runnable . Invece di SmurfMap<K, Void> , usa (o crea) un SmurfSet<K>

  • Modifica i client per renderli null-friendly. Ad esempio, non conosco una buona alternativa a Future<Void> . Futures di Guava. allAsList () restituisce un ArrayList incartato non modificabile, non un ImmutableList , probabilmente in parte perché un% -hostile%% di co_de impedirà il richiamo del metodo con ImmutableList s.

risposta data 27.05.2015 - 08:06
fonte

Leggi altre domande sui tag