Способы инкапсуляции выбора примитива Java; Избегание "волшебных" примитивов - PullRequest
4 голосов
/ 19 января 2012

Я пишу программу, которая создает большое количество больших массивов для хранения данных. Все эти данные должны храниться в оперативной памяти, поэтому я избегаю объектов и в настоящее время использую шорты для экономии места. Эти шорты служат идентификационными номерами, которые могут быть помещены в класс поиска для получения соответствующего объекта по запросу. Недавно я задал вопрос о том, понадобятся ли мне целые 2 байта, и теперь мне интересно, есть ли способ определить тип данных, хранящихся в одном месте в моем коде, чтобы я мог легко их изменить без необходимости выискивать каждое приведение, тип возврата и т. д., для которого в данный момент задано короткое замыкание.

Если бы я хотел использовать объекты, я мог бы просто сделать

class MySmallNumber extends Short{}

и при необходимости измените родительский класс.

Если бы это был C / C ++, я мог бы использовать

#define small short

для эффекта, который я ищу.

Я ищу способ сделать что-то подобное в Java, чтобы не требовалось хранить ссылки на 64-битные объекты в моих массивах. Любая помощь очень ценится. Прямо сейчас я смотрю на действительно грязную IDE, чтобы заменить все, чтобы сделать это.

Ответы [ 3 ]

2 голосов
/ 20 января 2012

Вы можете инкапсулировать свой массив в некоторый пользовательский класс. Это не должно добавить значительных накладных расходов, поскольку вы работаете с большими массивами.

Во всех других местах в вашем коде вы можете использовать долго. Когда вы передаете эти длинные значения в свой массив пользовательских классов, вы можете преобразовать его в тот, который вы используете внутри него.

Наконец, вам нужно внести изменения только в этот класс.

1 голос
/ 19 января 2012

Я бы предложил выделить весь код, который зависит от типа значений вашего идентификатора, в отдельный класс.Пусть этот класс обрабатывает все операции (включая поиск), которые зависят от того, являются ли значения идентификатора short, byte или что-то еще.Вы можете передавать и выводить отдельные значения как short или даже int значения, даже если внутренне они преобразованы в byte.(Так, например, было написано java.io.DataOutputStream.writeByte(int) - он принимает аргумент int и обрабатывает его как значение byte.)

0 голосов
/ 20 января 2012

не совсем уверен, что вы здесь, но это может быть интересно:

import java.util.Arrays;
interface Index {
    short getIndex(int i);
    void setIndex(int i, short value);
    int size();
}
class ShortIndexImpl implements Index {
    ShortIndexImpl(int n) {
        indices = new short[n];
    }
    @Override public short getIndex(int i) {
        return indices[i];
    }
    @Override public void setIndex(int i, short value) {
        indices[i] = value;
    }
    @Override public int size() {
        return indices.length;
    }
    final short[] indices;
}
class TenBitIndexImpl implements Index {
    TenBitIndexImpl(int n) {
        indices = new int[(n + 2) / 3];
    }
    @Override public short getIndex(int i) {
        int index = i / 3;
        int remainder = i % 3;
        int word = indices[index];
        return (short) (0x3ff & (word >> shifts[remainder]));
    }
    @Override public void setIndex(int i, short value) {
        int index = i / 3;
        int remainder = i % 3;
        int word = indices[index] & ~masks[remainder];
        int shiftedValue = ((int) value) << shifts[remainder];
        word |= shiftedValue;
        indices[index] = word;
    }
    @Override public int size() {
        return indices.length;
    }
    final int masks[] = new int[] { 0x3ff00000, 0xffc00, 0x3ff };
    final int shifts[] = new int[] { 20, 10, 0 };
    final int[] indices;
}
public class Main {
    static void test(Index index) {
        for (int i = 0; i < values.length; i++)
            index.setIndex(i, values[i]);
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i] + " " + index.getIndex(i));
            if (index.getIndex(i) != values[i])
                System.out.println("expected " + values[i] + " but got " + index.getIndex(i));
        }
    }
    public static void main(String[] args) {
        Index index = new ShortIndexImpl(values.length);
        test(index);
        index = new TenBitIndexImpl(values.length);
        test(index);
        System.out.println("indices");
        for (int i = 0; i < ((TenBitIndexImpl) index).indices.length; i++)
            System.out.println(((TenBitIndexImpl) index).indices[i]);
    }
    static short[] values = new short[] { 1, 2, 3, 4, 5, 6 };
}
...