DataLayout

interfaccia pubblica DataLayout
Sottoclassi indirette conosciute

Converte i dati archiviati in un buffer in un determinato tipo.

Le istanze DataLayout vengono utilizzate per definire un formato personalizzato per l'archiviazione e la lettura dei dati di un DataBuffer . Forniscono uno strato di segregazione tra il tipo di dati archiviati nel buffer (il tipo di buffer ) e il tipo di dati manipolati dall'utente finale (il tipo di utente ).

Poiché i metodi di conversione vengono invocati per ogni valore che viene scritto o letto, lavorare con i layout dei dati può avere un impatto negativo sulle prestazioni, quindi l'utilizzo diretto dei tipi primitivi dovrebbe essere preferito quando possibile.

Si consiglia inoltre di implementare layout di dati immutabili in modo che possano essere riapplicati a più buffer senza riallocare una nuova istanza per ciascuno di essi. Ad esempio:

 class BigIntegerBufferAllocator {

     public DataBuffer<BigInteger> allocate(long size) {
         return LAYOUT.applyTo(DataBuffers.ofLongs(size * LAYOUT.scale()));  // scale is 1 by default
     }

     private static final DataLayout<LongDataBuffer, BigInteger> LAYOUT = new DataLayout<LongDataBuffer, BigInteger>() {

         @Override
         public void writeObject(LongDataBuffer buffer, BigInteger value, long index) {
             buffer.setLong(value.longValue(), index);
         }

         @Override
         public BigInteger readObject(LongDataBuffer buffer, long index) {
             return BigInteger.valueOf(buffer.getLong(index));
         }
     };
 }
 

Metodi pubblici

buffer dati astratto <T>
applica a (buffer S)
Applica questo layout al buffer fornito.
astratto T
readObject (buffer S, indice lungo)
Legge n = scale() valori dal buffer in corrispondenza dell'indice specificato e li restituisce come un singolo valore nel tipo utente.
astratto int
scala ()
Indica il numero di valori buffer necessari per rappresentare un singolo valore utente, il valore predefinito è 1.
vuoto astratto
writeObject (buffer S, valore T, indice lungo)
Scrive un valore utente nel buffer in corrispondenza dell'indice specificato dopo averlo convertito nel tipo di buffer.

Metodi pubblici

public abstract DataBuffer <T> applyTo (buffer S)

Applica questo layout al buffer fornito.

L'istanza DataBuffer restituita è semplicemente un wrapper per il buffer originale e non dispone di un proprio spazio di archiviazione di backup.

Parametri
respingente il buffer di destinazione a cui applicare questo layout
ritorna
  • un buffer con questo layout

public abstract T readObject (buffer S, indice lungo)

Legge n = scale() valori dal buffer in corrispondenza dell'indice specificato e li restituisce come un singolo valore nel tipo utente.

È responsabilità degli implementatori di questa interfaccia leggere il valore da convertire dal buffer fornito, utilizzando il metodo più appropriato. Ad esempio, per un layout che converte un singolo long in un BigInteger ,

 @Override
 public BigInteger readObject(LongDataBuffer buffer, long index) {
   return BigInteger.valueOf(buffer.getLong(index));
 }
 
Se un singolo valore utente viene ridimensionato su più di un valore del buffer, index indica la posizione iniziale della sequenza da leggere dal buffer.

Parametri
respingente il buffer da cui leggere
indice posizione del buffer da leggere nel buffer
ritorna
  • il valore convertito

public abstract int scala ()

Indica il numero di valori buffer necessari per rappresentare un singolo valore utente, il valore predefinito è 1.

La scala deve essere positiva e deve essere un numero intero, il che significa che un singolo valore di buffer in un buffer non può essere utilizzato per rappresentare più di un valore utente.

public abstract void writeObject (buffer S, valore T, indice lungo)

Scrive un valore utente nel buffer in corrispondenza dell'indice specificato dopo averlo convertito nel tipo di buffer.

È responsabilità degli implementatori di questa interfaccia scrivere il valore convertito nel buffer specificato prima che questa chiamata ritorni, utilizzando il metodo più appropriato. Ad esempio, per un layout che converte un BigInteger in un singolo long ,

 @Override
 public void writeObject(LongDataBuffer buffer, BigInteger value, long index) {
   buffer.setLong(value.longValue(), index);
 }
 
Se un singolo valore utente viene ridimensionato su più di un valore del buffer, index indica la posizione iniziale della sequenza da scrivere nel buffer.

Parametri
respingente il buffer su cui scrivere
valore il valore nel tipo utente da convertire e scrivere
indice indice nel buffer in cui deve essere scritto il valore convertito