Eva
Java粉絲募集中
  • 簡介
  • 我們的優勢
  • 最新消息
  • 下載與使用
  • 範例與說明
    • Eva Objects >
      • Bean類別定義
      • Entity型別定義
      • Struct型別定義
      • 建立Entity空白物件
      • 建立Entity修改物件
      • 建立Entity條件物件
      • 建立Struct值物件
    • Eva_ORM >
      • ORM程式主體
      • 使用條件物件執行操作
      • 執行更複雜條件的操作.
      • 分頁取回資料
      • 操作JDBC的參數
      • Array Property的操作
      • Collection Property的操作
      • 更複雜的Collection Property
      • 指定表格名稱
      • 新增資料庫Dialect
    • Eva_IOC >
      • IOC程式主體
      • AOP應用
    • Eva_Struct >
      • Struct範例
      • Bit Strcut範例
      • 指標範例
      • 於Eva_ORM中使用
    • Eva_Sort >
      • 依指定Properties排序
      • 部份排序
      • 優先排序部份
    • Eva_Cache >
      • hashing-based cache
      • 非hashing-based cache
  • API列表
  • 技術支援
    • 協助開發
  • 相關書籍

Struct 型別定義.

Struct 中的 Property 都應該為完全抽像 (Abstract) 的, 因為當使用者將一個 Struct 物件指向某個位元陣列後, 再存取該 Struct 物件的 Property 時, 其資料應被讀自與儲存於被指向的位元陣列中, 而相關的儲存或讀取動作應由 Eva_Struct 實行, 使用者預先提供的 Property 預設行為, 與預設的儲存空間都是沒有意義的.

下列範例中的 E 介面, 即是一個合格的 Struct 型別, 首先, 它以 @Struct 做為標記, 並且在各個 Properties 上以 @FieldSeq 去標記, @FieldSeq 指示該 Property 於儲存體中分配空間時的順序. 因為 Java 類別內的方法是沒有順序性的, 所以這個標記是必要的. 接著, 因為 Eva_Struct 能夠支援的 Property 型別比 C 語言中 struct 能支援的還多, 而有些型別的所佔用空間大小是變動的, 所以需要額外的標記, 像是陣列型別的 Property 需要再用 @Dimension 標記, 不固定長度的型別, 如 String, 的 Property 需要再用 @Bytes 標記, 而最後, 因為 Struct 的 Property 需全為抽象的, 無法設定預設值, 故若有預設值的需求需用 @DefaultValue 標記出來.
package struct;

import com.logntw.eva.anno.bean.Dimension;
import com.logntw.eva.anno.struct.Bytes;
import com.logntw.eva.anno.struct.DefaultValue;
import com.logntw.eva.anno.struct.FieldSeq;
import com.logntw.eva.anno.struct.Struct;

@Struct
public interface E
{
  @FieldSeq(1)
  byte getW();
  void setW(byte w);  
  
  @FieldSeq(2)
  @Dimension(3)
  @Bytes(2)
  @DefaultValue("a,c,ef")
  String[] getX();
  void setX(String[] x);  
  
  @FieldSeq(3)
  @Dimension(2)
  @Bytes(3)
  @DefaultValue("ghi,jk")
  String[] getY();
  void setY(String[] y);  
  
  @FieldSeq(4)
  byte getZ();
  void setZ(byte z);  
}
而下面一個 BitStruct 類別的定義就如同 Struct 類別的情況, 類別需以 @BitStruct 標記, 且在下例中, 該標記還設定了將以 BIG_ENDIAN 的方式去存取資料. 而 BitStruct 中的每個 Property 還需要 @Bits 標記來說明所佔用的空間大小.
package struct;

import com.logntw.eva.anno.bean.ByteOrder.Order;
import com.logntw.eva.anno.bitstruct.BitStruct;
import com.logntw.eva.anno.bitstruct.Bits;
import com.logntw.eva.anno.struct.FieldSeq;

@BitStruct(order=Order.BIG_ENDIAN)
public interface D
{
  @Bits(1)
  @FieldSeq(1)    
  byte getF1();
  void setF1(byte f1);
  
  @Bits(3)
  @FieldSeq(2)
  int  getF2();    
  void setF2(int f2);
  
  @Bits(1)
  @FieldSeq(3)
  char getF3();
  void setF3(char f3);
  
  @Bits(3)
  @FieldSeq(4)
  int  getF4();
  void setF4(int f4);
  
  @Bits(4)
  @FieldSeq(5)
  int  getF5();
  void setF5(int f5);    

  @Bits(4)
  @FieldSeq(11)
  void setF6(byte f6);    
  byte getF6();
  
  @Bits(8)
  @FieldSeq(12)
  byte getF7();    
  void setF7(byte f7);
  
  @Bits(8)
  @FieldSeq(13)
  int  getF8();    
  void setF8(int f8);
  
  @Bits(4)
  @FieldSeq(14)
  char getF9();    
  void setF9(char f9);
  
  @Bits(4)
  @FieldSeq(15)
  int  getF10();
  void setF10(int f10);
  
  @Bits(2)
  @FieldSeq(101)
  int  getF11();
  void setF11(int f11);
    
  @Bits(2)
  @FieldSeq(102)
  byte getF12();
  void setF12(byte f12);
}
Powered by Create your own unique website with customizable templates.