DataLayout

DataLayout อินเทอร์เฟซสาธารณะ
คลาสย่อยทางอ้อมที่รู้จัก

แปลงข้อมูลที่เก็บไว้ในบัฟเฟอร์ให้เป็นประเภทที่กำหนด

อินสแตนซ์ DataLayout ใช้เพื่อกำหนดรูปแบบที่กำหนดเองสำหรับจัดเก็บและอ่านข้อมูลของ DataBuffer โดยจัดให้มีชั้นการแยกระหว่างประเภทของข้อมูลที่จัดเก็บไว้ในบัฟเฟอร์ (ประเภท บัฟเฟอร์ ) และประเภทของข้อมูลที่จัดการโดยผู้ใช้ปลายทาง (ประเภท ผู้ใช้ )

เนื่องจากมีการใช้วิธีการแปลงสำหรับทุกค่าที่เขียนหรืออ่าน การทำงานกับโครงร่างข้อมูลจึงอาจส่งผลเสียต่อประสิทธิภาพ ดังนั้นควรใช้ประเภทดั้งเดิมโดยตรงทุกครั้งที่เป็นไปได้

นอกจากนี้ เราขอแนะนำให้ใช้เลย์เอาต์ข้อมูลที่ไม่เปลี่ยนรูปแบบเพื่อให้สามารถนำไปใช้กับบัฟเฟอร์หลายตัวได้โดยไม่ต้องจัดสรรอินสแตนซ์ใหม่สำหรับแต่ละบัฟเฟอร์ ตัวอย่างเช่น:

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

วิธีการสาธารณะ

บทคัดย่อ DataBuffer <T>
ApplyTo (บัฟเฟอร์ S)
ใช้เค้าโครงนี้กับบัฟเฟอร์ที่ให้มา
นามธรรมต
readObject (บัฟเฟอร์ S, ดัชนีแบบยาว)
อ่านค่า n = scale() จากบัฟเฟอร์ที่ดัชนีที่กำหนดและส่งกลับเป็นค่าเดียวในประเภทผู้ใช้
บทคัดย่อ
มาตราส่วน ()
ระบุจำนวนค่าบัฟเฟอร์ที่จำเป็นในการแสดงค่าผู้ใช้รายเดียว ค่าเริ่มต้นคือ 1
ความว่างเปล่าที่เป็นนามธรรม
writeObject (บัฟเฟอร์ S, ค่า T, ดัชนีแบบยาว)
เขียนค่าผู้ใช้ลงในบัฟเฟอร์ที่ดัชนีที่กำหนดหลังจากแปลงเป็นประเภทบัฟเฟอร์

วิธีการสาธารณะ

DataBuffer นามธรรมสาธารณะ <T> ApplyTo (S บัฟเฟอร์)

ใช้เค้าโครงนี้กับบัฟเฟอร์ที่ให้มา

อินสแตนซ์ DataBuffer ที่ส่งคืนเป็นเพียงตัวหุ้มของบัฟเฟอร์ดั้งเดิม และไม่มีพื้นที่เก็บข้อมูลสำรองของตัวเอง

พารามิเตอร์
บัฟเฟอร์ บัฟเฟอร์เป้าหมายที่จะใช้เค้าโครงนี้
การส่งคืน
  • บัฟเฟอร์ที่มีเค้าโครงนี้

บทคัดย่อสาธารณะ T readObject (บัฟเฟอร์ S, ดัชนีแบบยาว)

อ่านค่า n = scale() จากบัฟเฟอร์ที่ดัชนีที่กำหนดและส่งกลับเป็นค่าเดียวในประเภทผู้ใช้

เป็นความรับผิดชอบของผู้ดำเนินการอินเทอร์เฟซนี้ในการอ่านค่าที่จะแปลงจากบัฟเฟอร์ที่กำหนด โดยใช้วิธีที่เหมาะสมที่สุด ตัวอย่างเช่น สำหรับเลย์เอาต์ที่แปลง long เดี่ยวเป็น BigInteger

 @Override
 public BigInteger readObject(LongDataBuffer buffer, long index) {
   return BigInteger.valueOf(buffer.getLong(index));
 }
 
หากค่าผู้ใช้รายเดียวปรับขนาดมากกว่าค่าบัฟเฟอร์มากกว่าหนึ่ง index จะระบุตำแหน่งเริ่มต้นของลำดับที่จะอ่านจากบัฟเฟอร์

พารามิเตอร์
บัฟเฟอร์ บัฟเฟอร์ที่จะอ่าน
ดัชนี ตำแหน่งของบัฟเฟอร์ที่จะอ่านในบัฟเฟอร์
การส่งคืน
  • มูลค่าที่แปลงแล้ว

ระดับ int นามธรรมสาธารณะ ()

ระบุจำนวนค่าบัฟเฟอร์ที่จำเป็นในการแสดงค่าผู้ใช้รายเดียว ค่าเริ่มต้นคือ 1

มาตราส่วนต้องเป็นค่าบวกและต้องเป็นจำนวนเต็ม ซึ่งหมายความว่าค่าบัฟเฟอร์เดียวในบัฟเฟอร์ไม่สามารถใช้เพื่อแสดงค่าผู้ใช้มากกว่าหนึ่งค่าได้

โมฆะนามธรรมสาธารณะ writeObject (บัฟเฟอร์ S, ค่า T, ดัชนีแบบยาว)

เขียนค่าผู้ใช้ลงในบัฟเฟอร์ที่ดัชนีที่กำหนดหลังจากแปลงเป็นประเภทบัฟเฟอร์

เป็นความรับผิดชอบของผู้ดำเนินการอินเทอร์เฟซนี้ในการเขียนค่าที่แปลงแล้วไปยังบัฟเฟอร์ที่กำหนดก่อนที่การโทรนี้จะกลับมา โดยใช้วิธีที่เหมาะสมที่สุด ตัวอย่างเช่น สำหรับโครงร่างที่แปลง BigInteger เป็น single long

 @Override
 public void writeObject(LongDataBuffer buffer, BigInteger value, long index) {
   buffer.setLong(value.longValue(), index);
 }
 
หากค่าผู้ใช้รายเดียวขยายขนาดค่าบัฟเฟอร์มากกว่าหนึ่งค่า index จะระบุตำแหน่งเริ่มต้นของลำดับที่จะเขียนลงในบัฟเฟอร์

พารามิเตอร์
บัฟเฟอร์ บัฟเฟอร์ที่จะเขียนถึง
ค่า ค่าในประเภทผู้ใช้ที่จะแปลงและเขียน
ดัชนี ดัชนีในบัฟเฟอร์ที่ควรเขียนค่าที่แปลงแล้ว