Subclases indirectas conocidas Bfloat16Layout , BoolLayout , BooleanDataLayout <S extiende DataBuffer <?>>, ByteDataLayout <S extiende DataBuffer <?>>, DoubleDataLayout <S extiende DataBuffer <?>>, Float16Layout , FloatDataLayout <S extiende DataBuffer <?>>, IntDataLayout <S extiende DataBuffer <?>>, LongDataLayout <S extiende DataBuffer <?>>, ShortDataLayout <S extiende DataBuffer <?>>, StringLayout |
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)); }
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); }
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 buffer donde se debe escribir el valor convertido |