如何使用OpenHFT / Chronicle-Values中的@Array(length =?)注释

时间:2016-09-08 11:36:50

标签: java arrays memory-management chronicle

这个问题与Chronicle-Values

有关

网站上的一个例子是:

interface SomeStats {
    @Array(length=100)
    long getPercentFreqAt(int index);
    void setPercentFreqAt(int index, long percentFreq);
    long addPercentFreqAt(int index, long addition);
}

此处注释仅适用于其中一个方法。这是否意味着之后的所有方法都被视为处理数组数据?

one of the test个案例中,我找到了

package net.openhft.chronicle.values;

public interface HasArraysInterface {
    @Array(length = 4)
    void setFlagAt(int idx, boolean flag);

    boolean getFlagAt(int idx);

    @Array(length = 4)
    void setByteAt(int idx, byte b);

    byte getByteAt(int idx);

    @Array(length = 4)
    void setShortAt(int idx, short s);

    short getShortAt(int idx);

    @Array(length = 4)
    void setCharAt(int idx, char ch);

    char getCharAt(int idx);

    @Array(length = 4)
    void setIntAt(int idx, int i);

    int getIntAt(int idx);

    @Array(length = 4)
    void setFloatAt(int idx, float f);

    float getFloatAt(int idx);

    @Array(length = 4)
    void setLongAt(int idx, long l);

    long getLongAt(int idx);

    @Array(length = 4)
    void setDoubleAt(int idx, double d);

    double getDoubleAt(int idx);

    @Array(length = 4)
    void setStringAt(int idx, @MaxUtf8Length(8) String s);

    String getStringAt(int idx);
}

我从中理解的是,您可以在此界面中拥有多个数组,其中@Array(length = 4)适用于以At结尾的方法,直到下一个注释。这是对的吗?

此外,您可以使用以下内容来模拟4个double的数组和8个字符串的数组:

    @Array(length = 4)
    void setDoubleAt(int idx, double d);

    double getDoubleAt(int idx);

    @Array(length = 8)
    void setStringAt(int idx, @MaxUtf8Length(8) String s);

    String getStringAt(int idx);

在一个界面中分配多个@Array(length= ?)的多个阵列的内存布局是什么?您可以在面向列或行面向布局之间进行选择吗?如果length不同,将如何处理布局?

而不是:

interface SomeStats {
    @Array(length=100)
    long getPercentFreqAt(int index);
    void setPercentFreqAt(int index, long percentFreq);
    long addPercentFreqAt(int index, long addition);
}
你可以把它写成:

@Array(length=100)
interface SomeStats {
    long getPercentFreqAt(int index);
    void setPercentFreqAt(int index, long percentFreq);
    long addPercentFreqAt(int index, long addition);
}

暗示@Array(length=100)适用于整个界面。

你也可以推迟指定长度直到创作点吗?

2 个答案:

答案 0 :(得分:2)

  1.   

    此处注释仅适用于其中一个方法。这是否意味着之后的所有方法都被视为处理数组数据?

  2. 来自@Array javadoc

      

    此注释必须放在访问数组元素的单个方法上:getter,setter或adder等。

    予。即@Array应放在 one(any)方法上,访问字段。 “字段”由标准访问器方法定义,名称,即。即在您的示例中,在SomeStats值界面中,有一个名为PercentFreq的单个(数组)字段。如果您向此接口添加getAnotherField()setAnotherField()等方法,则它将是一个单独的字段,@Array注释不适用于此字段,即即它将是一个“标量”字段,除非您将@Array放在getAnotherField()setAnotherField()上并为这些方法添加int index参数,并-At后缀。< / p>

    2

      

    我从中理解的是,在此接口中可以有多个数组,其中@Array(length = 4)适用于以At结尾的方法,直到下一个注释。这是对的吗?

    不,不是“直到下一个注释”。注释应用于字段。字段访问器方法(由字段名称标识)可以在接口定义中以任何顺序进行。

    3

      

    在一个接口中使用多个@Array(长度=?)分配的多个数组的内存布局是什么?您可以在面向列或行面向布局之间进行选择吗?如果长度不同,如何处理布局?

    在您的示例中,布局为:

    Double element 0 (8 bytes)
    Double element 1 (8 bytes)
    Double element 2 (8 bytes)
    Double element 3 (8 bytes)
    String element 0 (9 bytes: 1 bytes to encode size + 8 bytes of reserved space)
    ...
    String element 7 (9 bytes)
    

    要进行基于行的对齐,您应该定义另一个接口:

    interface Row {
        void setDouble(double d);
        double getDouble();
    
        void setString(@MaxUtf8Length(8) String s);
        String getString();
    }
    

    然后定义数组或行:

    interface MyTopInterface {
        @Array(length=8)
        void setRowAt(int index, Row row);
        Row getRowAt(int index);
    }
    

    这将同样有效并占用相同数量的内存,如“列式”布局。 Read about nested structures in the tutorial.

    4

      

    暗示@Array(length = 100)适用于整个界面。

    你不能这样做,使用上面建议的模式(嵌套接口)

    5

      

    你也可以推迟指定长度直到创作点吗?

    不,“纪事价值”的整体思想是他们的大小总数是静态知道的。

答案 1 :(得分:0)

在空间分配到位时需要数组长度。当您指定长度N时,意味着您只能拥有索引0&lt; = index&lt; Ñ