封装Java原语选择的方法;避免“魔术”原语

时间:2012-01-19 19:43:15

标签: java coding-style primitive primitive-types

我正在编写一个程序,它创建了大量的大型数组来存储数据。所有这些数据都必须保存在RAM中,所以我要避开对象,并且目前使用短路来节省空间。这些短裤用作ID号,可以放入查找类以按需获取相应的对象。我最近质疑我是否需要整个2个字节的短片,所以我现在想知道是否还有定义数据类型存储在我的代码中的一个地方,以便我可以轻松地更改它而不必追捕当前设置为短的每个演员表,返回类型等。

如果我愿意使用对象,我可以轻松做到

class MySmallNumber extends Short{}

并在必要时更改父类。

如果这是C / C ++,我可以使用

#define small short

我正在寻找的效果。

我正在寻找一种在java中做这样的事情的方法,它不需要在我的数组中存储64位对象引用。任何帮助是极大的赞赏。现在我正在寻找一个非常混乱的IDE替换所有这些来做到这一点。

3 个答案:

答案 0 :(得分:2)

您可以在某个自定义类中包含数组。它不应该增加相当大的空间开销,因为你使用大型数组。

在代码中的所有其他位置,您可以使用很长时间。当您将这些长整数传递给数组自定义类时,您可以将其转换为您在其中使用的那个。

最后,您必须仅在这一个班级进行更改。

答案 1 :(得分:1)

我建议将所有依赖于ID值类型的代码分解到一个单独的类中。让该类处理依赖于ID值是shortbyte还是其他内容的所有操作(包括查找)。您可以将单个值输入和输出为short或甚至int值,即使它们在内部已转换为byte。 (例如,这是java.io.DataOutputStream.writeByte(int)的编写方式 - 它需要一个int参数并将其视为byte值。)

答案 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 };
}