2

良い一日、

私は良いグーグル検索を試み、さらにはいくつかの読書を試みましたが、どのように進めるか正確にはわかりません. 問題は次のとおりです。

duplicate()java.nio.Buffer の実装を呼び出すと、元のバッファで設定したバイト オーダーbuf.order(ByteOrder.LITTLE_ENDIAN)が保持されません。これは問題です。そこで、この例のように次のことを実行できる静的メソッドの作成に着手しました。

public static ByteBuffer endianPreservingDuplicate(ByteBuffer b){
    ByteOrder holder = b.order();
    ByteBuffer ret = b.duplicate();
    ret.order(holder);
    return ret;
}

これは機能しますが、すべてのタイプ(ByteBuffer、FloatBuffer、IntBufferなど)に対してこの関数を実装する必要なく、これを行う実際の方法(おそらくジェネリック?)はありますか?

4

2 に答える 2

2

コンパイラが判断できる限り、duplicateこれらのさまざまなクラスのメソッド間に関係はありません。スーパータイプ (スーパークラスまたはインターフェース) によって定義されていません。したがって、それらの唯一の共通点はメソッド シグネチャ (名前とパラメーター) であり、それにアクセスする唯一の方法はリフレクションを介することです。についても同様ですorder。これは可能ですが、非常に面倒で、コードが何を行っているかを確認するのに役立つ IDE の機能に干渉します。それはおそらく価値がありません。

さらに、さらに大きな問題があります。メソッドはByteBuffer#order(ByteOrder)バイトオーダーの設定に依存しています。しかし、そのようFloatBufferな方法さえありIntBufferません。引数を取らず、バイト オーダーを返す はありますが、バイト オーダーを取得してそれを採用する はありません。(これは、それらのバイト オーダーが実際には独自のものではないためです。バイト バッファーのラッパーである場合は、そのバイト オーダーを使用し、配列のラッパーである場合は、システムのバイト オーダーを使用します。)order()order(ByteOrder)

良いニュースは. . . できないため、すべての型にこのメソッドを実装する必要はありません。:-P

于 2012-11-27T22:57:40.497 に答える
2

ジェネリックとリフレクションを組み合わせて使用​​することもできますが、それは醜いです:

public static <T extends Buffer> T endianPreservingDuplicate(T b) throws Exception {
    Class<?> clazz = b.getClass();
    Method getOrder = getMethod(clazz, "order");
    ByteOrder orderTemp = (ByteOrder) getOrder.invoke(b);
    Method duplicate = getMethod(clazz, "duplicate");
    @SuppressWarnings("unchecked") // cast is safe
    T copy = (T) duplicate.invoke(b);
    Method setOrder = getMethod(clazz, "order", ByteOrder.class);
    setOrder.invoke(copy, orderTemp);
    return copy;
}

private static Method getMethod(Class<?> clazz, String name, Class<?>...params) throws NoSuchMethodException {
    try {
        Method method = clazz.getDeclaredMethod(name, params);
        method.setAccessible(true);
        return method;
    } catch (NoSuchMethodException e) {
        Class<?> superclass = clazz.getSuperclass();
        if (!superclass.equals(Buffer.class)) {
            return getMethod(superclass, name, params);
        } else {
            throw new NoSuchMethodException("no " + name + " method");
        }
    }
}

order()またはなしの Buffer 実装がパラメーターduplicate()として渡されると、例外がスローされbます。

最適なオプションは、バッファ タイプごとに個別のメソッドを作成することです。

コードをレビューし、更新を提案してくれたruakhに部分的に感謝します。

于 2012-11-27T23:03:27.637 に答える