14

キーとしてジェネリック型の代わりにプリミティブを使用するGuava テーブルの代替手段はありますか?

プリミティブを使用して、Java Numbers と Java Maps によって作成された追加のエントリ オブジェクトを使用することによって引き起こされるオート ボクシングを回避したいと考えています。

Trove TLongObjectMapを使用して独自の基本的な LongLongObjectTable を作成しましたが、標準ライブラリが利用可能な場合はそれを使用することを好みます。

private static class LongLongObjectTable<T> {
    private final TLongObjectMap<TLongObjectMap<T>> backingMap = new TLongObjectHashMap<>();

    T get(final long rowKey, final long columnKey) {
        final TLongObjectMap<T> map = this.backingMap.get(rowKey);
        if (map == null) {
            return null;
        }
        return map.get(columnKey);
    }

    void put(final long rowKey, final long columnKey, final T value) {
        TLongObjectMap<T> map = this.backingMap.get(rowKey);
        if (map == null) {
            map = new TLongObjectHashMap<>();
            this.backingMap.put(rowKey, map);
        }
        map.put(columnKey, value);
    }

    Collection<T> values() {
        final List<T> values = new ArrayList<T>();
        for (final TLongObjectMap<T> map : this.backingMap.valueCollection()) {
            values.addAll(map.valueCollection());
        }
        return values;
    }
}
4

1 に答える 1

3

あまり。問題は、そのような実装が差し迫って (定義上) 一般的ではなく、1 つずつ定義する必要があることです。これは、かなりの繰り返しと、潜在的に多くの可能なコレクションの順列を意味します。

とは言っても、他の言語では、コンパイラーに型消去を使用するのではなく、型 T を使用してコレクションのインスタンスのコードを生成させることでこれを許可していますが、それは Java が行った方向ではありません。

オーバーヘッドが比較的低いため、既存のコレクションで Long や Integer などの自動ボックス化されたバリアントを使用できるという事実は、ほとんどの場合に十分です。また、標準ライブラリの設計者はおそらく、追加のカスタム バリアントで汚染するよりも、スリムに保つことを好みます。

于 2015-07-08T13:55:19.243 に答える