2012-01-19 1 views
4

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

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

class MySmallNumber extends Short{} 

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

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

#define small short 

эффекта я ищу.

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

+0

возможно дубликат [? Есть ли эквивалент Java или методология ЬурейеЕ ключевое слово в C++] (HTTP: // stackoverflow.com/questions/1195206/is-there-a-java-equivalent-or-methodology-for-the-typedef-keyword-in-c) –

+4

«Я мог бы просто просто сделать класс» MySmallNumber расширяет Short {} '" - Нет, ты не мог, потому что «Короткая» - «финал». –

+0

Не точный дубликат, но я думаю, что ответы на другой вопрос по существу охватывают и этот. В принципе, это не способ сделать это для примитивов в Java. –

ответ

1

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

+0

Спасибо за очень четкое объяснение. Я был привязан к использованию фактических сохраненных типов данных во всем коде, но это, безусловно, правильный способ справиться с ситуациями. – thehivemind5

2

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

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

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

0

не совсем уверен, что вы после этого здесь, но это может заинтересовать:

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 }; 
} 
Смежные вопросы