2

这个问题是关于Chronicle-Values 的

在该站点中找到的一个示例是:

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

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

在我发现的一个测试用例中

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 个双精度数组和 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)适用于整个界面。

您还可以将指定长度推迟到创建点吗?

4

2 回答 2

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

@Arrayjavadoc

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

IE。@Array应该放在一个(任何)方法上,访问一个字段。“字段”由标准访问器方法和名称定义,即在您的示例中,在SomeStats值接口中,有一个(数组)字段,名为PercentFreq。如果您将类似getAnotherField(),的方法添加setAnotherField()到此接口,它将是一个单独的字段,@Array注释不适用于该字段,即它将是一个“标量”字段,除非您@Array为这些方法添加getAnotherField()setAnotherField()添加int index参数和-At后缀。

2.

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

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

3.

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

在您的示例中,布局将是:

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

这将与“面向列”布局一样有效并占用相同数量的内存。阅读教程中的嵌套结构。

4.

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

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

5.

您还可以将指定长度推迟到创建点吗?

不,Chronicle Values 的整个想法是它们的总大小是静态已知的。

于 2016-09-08T20:50:24.783 回答
0

由于空间已就地分配,因此需要数组长度。当您指定长度为 N 时,这意味着您只能拥有索引 0 <= index < N。

于 2016-09-08T12:28:41.873 回答