如何编写一个类来支持它所代表的结构的多个版本?

tro*_*yal 1 java

假设我想要一个表示内存中数据结构的类.在此结构中,前两个字节表示它的结构版本.后面的数据的顺序和大小取决于结构的版本.

例如:版本1是一个10字节的结构,如下所示:

  • 字节偏移0:格式版本(2个字节)
  • 字节偏移2:数据部分A(4字节)
  • 字节偏移6:数据部分B(4字节)

版本2是一个20字节的结构,如下所示:

  • 字节偏移0:格式版本(2个字节)
  • 字节偏移2:数据部分A(8字节)
  • 字节偏移量10:数据部分B(6个字节)
  • 字节偏移16:数据部分C(4字节)

我希望我的类能够支持这两个版本,而不必让类的用户指定要使用的版本.也就是说,当构造对象时,它应该能够使用Format Version字段来确定其结构应该是什么.然后,应根据结构适当地创建每个字段的getter/setter.我还希望将来能够添加对其他结构版本的支持.每个新版本的结构很可能包含与旧版本相同的所有字段,但可能每个字段的分配长度更长,也许还有一些新添加的字段.

据我所知,我唯一的限制是格式版本字段始终出现在字节偏移0处,并且总是2个字节长.

那么,有可能实现我的目标吗?

Car*_*icz 6

通常,您将为每个不同版本的结构创建和使用单独的类.您可以为它们提供一个通用接口,以便您可以通过常见类型进行寻址和存储.然后,这些不同的结构类可以包含用于处理数据的不同变体的不同字段和方法.

// The common interface. Every struct knows how to read and write itself.
public interface MultiStruct {
  public void readData(InputStream in);
  public void writeData(OutputStream out);
}

// This class knows only about storing a format code
public abstract class AbstractMultiStruct implements MultiStruct {
  protected static final int FORM1 = 1, FORM2 = 2;

  private int format;

  public AbstractMultiStruct(int fmt) {
    this.format = fmt;
  }

  public int getFormat() {
    return this.format;
  }

}

// This is the first real struct implementation.
public class Struct1 extends AbstractMultiStruct {
  private char[] dataA;
  private char[] dataB;

  public Struct1() {
    super(FORM1);
    this.dataA = new char[22];
    this.dataB = new char[33];
  }

  public void readData(InputStream in) {
    ...
  }

  public void writeData(OutputStream out) {
    ...
  }

  public String toString() {
    ...
  }


}
Run Code Online (Sandbox Code Playgroud)