DataLayout

interfaz pública diseño de datos
Subclases indirectas conocidas

Convierte los datos almacenados en un búfer a un tipo determinado.

Las instancias DataLayout se utilizan para definir un formato personalizado para almacenar y leer datos de un DataBuffer . Proporcionan una capa de segregación entre el tipo de datos almacenados en el búfer (el tipo de búfer ) y el tipo de datos manipulados por el usuario final (el tipo de usuario ).

Dado que los métodos de conversión se invocan para cada valor que se escribe o lee, trabajar con diseños de datos puede tener un impacto negativo en el rendimiento, por lo que se debe preferir el uso de tipos primitivos directamente siempre que sea posible.

También se recomienda implementar diseños de datos inmutables para que puedan volver a aplicarse a múltiples buffers sin reasignar una nueva instancia para cada uno de ellos. Por ejemplo:

 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));
         }
     };
 }
 

Métodos públicos

buffer de datos abstracto <T>
aplicar a (búfer S)
Aplique este diseño al búfer proporcionado.
resumen T
readObject (búfer S, índice largo)
Lee valores n = scale() del búfer en el índice dado y los devuelve como un valor único en el tipo de usuario.
resumen entero
escala ()
Indica el número de valores de búfer necesarios para representar un único valor de usuario; el valor predeterminado es 1.
vacío abstracto
writeObject (búfer S, valor T, índice largo)
Escribe un valor de usuario en el búfer en el índice dado después de convertirlo al tipo de búfer.

Métodos públicos

Buffer de datos abstracto público <T> applyTo (búfer S)

Aplique este diseño al búfer proporcionado.

La instancia DataBuffer devuelta es simplemente un contenedor del búfer original y no tiene un almacenamiento de respaldo propio.

Parámetros
buffer el búfer de destino al que aplicar este diseño
Devoluciones
  • un buffer con este diseño

public abstract T readObject (búfer S, índice largo)

Lee valores n = scale() del búfer en el índice dado y los devuelve como un valor único en el tipo de usuario.

Es responsabilidad de los implementadores de esta interfaz leer el valor a convertir del búfer dado, utilizando el método más apropiado. Por ejemplo, para un diseño que convierte un único long en un BigInteger ,

 @Override
 public BigInteger readObject(LongDataBuffer buffer, long index) {
   return BigInteger.valueOf(buffer.getLong(index));
 }
 
Si un único valor de usuario se escala sobre más de un valor de búfer, index indica la posición inicial de la secuencia que se leerá del búfer.

Parámetros
buffer el buffer para leer
índice posición del buffer para leer en el buffer
Devoluciones
  • el valor convertido

escala int abstracta pública ()

Indica el número de valores de búfer necesarios para representar un único valor de usuario; el valor predeterminado es 1.

La escala debe ser positiva y debe ser un número entero, lo que significa que un único valor de búfer en un búfer no se puede utilizar para representar más de un valor de usuario.

objeto de escritura vacío abstracto público (búfer S, valor T, índice largo)

Escribe un valor de usuario en el búfer en el índice dado después de convertirlo al tipo de búfer.

Es responsabilidad de los implementadores de esta interfaz escribir el valor convertido en el búfer dado antes de que regrese esta llamada, utilizando el método más apropiado. Por ejemplo, para un diseño que convierte un BigInteger en un único long ,

 @Override
 public void writeObject(LongDataBuffer buffer, BigInteger value, long index) {
   buffer.setLong(value.longValue(), index);
 }
 
Si un único valor de usuario se escala sobre más de un valor de búfer, index indica la posición inicial de la secuencia que se escribirá en el búfer.

Parámetros
buffer el buffer para escribir
valor el valor en el tipo de usuario para convertir y escribir
índice índice en el búfer donde se debe escribir el valor convertido