2

この質問はChronicle-Valuesに関するものです

サイトで見つかった一例は次のとおりです。

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

ここでは、アノテーションはメソッドの 1 つにのみ適用されます。これは、その後のすべてのメソッドが配列データで動作するものとして扱われることを意味しますか?

私が見つけたテストケースの1つで

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= ?)1 つのインターフェイス内で複数割り当てられた複数の配列のメモリ レイアウトはどのようなものですか? 列指向または行指向のレイアウトを選択できますか? が異なる場合、レイアウトはどのように処理されます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. ここでは、アノテーションはメソッドの 1 つにのみ適用されます。これは、その後のすべてのメソッドが配列データで動作するものとして扱われることを意味しますか?

@Arrayjavadocから:

この注釈は、配列要素にアクセスする単一のメソッド (getter、setter、adder など) に配置する必要があります。

私はe。フィールドにアクセスする1 つの (任意の)@Arrayメソッドに配置する必要があります。「フィールド」は、標準のアクセサメソッドと名前によって定義されます。つまり、例では、値インターフェイスには、という名前の単一の(配列)フィールドがあります。のようなメソッドをこのインターフェイスに追加すると、注釈が適用されない別のフィールドになります。つまり、またはを付けてそれらのメソッドにパラメーターとサフィックスを追加しない限り、それは「スカラー」フィールドになります。SomeStatsPercentFreqgetAnotherField()setAnotherField()@Array@ArraygetAnotherField()setAnotherField()int index-At

2.

このことから私が理解したのは、 @Array(length = 4) が次のアノテーションまで At で終わるメソッドに適用される、このインターフェース内に複数の配列を持つことができるということです。これは正しいですか?

いいえ、「次の注釈まで」ではありません。フィールドに注釈が適用されます。フィールド アクセサー メソッド (フィールド名で識別) は、インターフェイス定義内で任意の順序で実行できます。

3.

1 つのインターフェイス内で複数の @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.

また、長さの指定は作成時まで延期していただけますか?

いいえ、クロニクル値の全体的な考え方は、それらのサイズの合計が静的に知られているということです。

于 2016-09-08T20:50:24.783 に答える