繁体   English   中英

Java中的自定义数据类型

[英]Custom Data-type in Java

对于应用程序,我需要具有24位的无符号数据类型。 不幸的是,这种数据类型在Java中不可用。 我打算将其实现为一个新类。但是我不确定这种实现的性能。

最好写自己的课吗?

如果可行,是否有可能表现良好?

大概,您的意思是将其实现为使用较大数据类型和边界检查的类,如下所示:

public class Unsigned24 {
    private static final MAX_UNSIGNED24 = Math.pow(2, 24) - 1;
    private static final MIN_UNSIGNED24 = 0;

    private final int value;

    public Unsigned24(int value) {
        if (value > MAX_UNSIGNED24 || value < MIN_UNSIGNED24)
            throw new IllegalArgumentException("value out of bounds: " + value);
        this.value = value;
    }

    public int getValue() {
        return value;
    }

// ... other methods, such as equals(), comparison, addition, subtraction, etc.
}

这会起作用,但可能不值得为此烦恼。 另外,它实际上并不只占用24位内存,而是占用32位内存和一个对象的开销。

这确实取决于您的目标。 为什么要使用24位整数。

仅仅是因为您在值上有界限约束吗? 如果是这样,您可能想要执行上述操作。

是因为您有很多它们,并且想要节省内存吗? 如果是这样,您可能想要构建一个类来抽象一个24位整数数组,并在内部将它们连续保存在字节数组中。

是因为您要与某些硬件或网络接口连接,而这些接口期望恰好是24位? 在这种情况下,您可能需要查看java.nio类。

如果要节省空间,可以使用int进行计算,并将最低有效3个字节映射到一个byte []或仅映射三个字节:

  public static byte[] convert(int i) {
    return new byte[]{ (i & 0xff0000) >> 16, (i & 0xff00) >> 8, (i & 0xff) };
  }

  public static int convert(byte[] b) {
    if (b == null && b.length != 3)
      throw new IllegalArgumentException();

      return (b[2] << 16) | (b[1] << 8) | b;
  }

(无法验证它是否没有错误,但至少它应该给出一个主意)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM