我对某些 Java 框架使用的实现样式有疑问/担忧。
首先,作为一般背景,我从实践中知道创建对象数组比创建原始/原始数组类型要昂贵得多。例如,如果您向下面的某个层询问大量字符数据,最有效的选择是使用 char[]、byte[]、ByteArray 等类型,而不是发明包装数据类型并返回对象数组。
但是,我已经看到那里的框架似乎实现了自己的数据类型,并期望这些类型的数组来回传递。这会导致所有提到的性能和成本问题,并且由于转换代码开销而非常不方便。
例如,考虑 sblim 客户端的 javax.cim 包中定义的类型:
http://sblim.sourceforge.net/cim-client2-v22-doc/javax/cim/package-summary.html
有一种名为 UnsignedInteger8 的类型,它基本上是一个字节。还有其他类型也将具有等效的有效原始类型。有一条关于 DMTF 数据类型的评论似乎表明它们在 Java 类中封装了不同的数据类型以符合协议,但代价是什么?
所以,直截了当,我想知道在 Java 性能和框架设计方面更有经验的人是否可以就 sblim 客户端是否是一个有效的实现提供一些反馈。当它们可以简单地使用字节或字符时,是否有使用 UnsignedInteger8 之类的包装类型的理由或理由?为处理所有 DMTF 数据类型创建标准化和统一的代码是否证明了使用对象数组而不是原始类型的性能不足?我的观点是对还是错?
提前致谢!
更新
为了进一步说明我的观点,请考虑以下摘录:
static StringBuilder convertToText (UnsignedInteger8[] u8arr) {
if (u8arr== null) return null;
StringBuilder sb = new StringBuilder(u8arr.length);
for (UnsignedInteger8 u8 : u8arr) {
sb.append((char)u8.shortValue());
}
return sb;
}
我将不得不使用这样的代码将一大块字符数据映射到 StringBuilder。这确实是低效的,因为数据已经由 CIM 加载到内存中。为什么我需要创建一个新的 StringBuilder 并再次迭代/复制所有数据?为什么 CIM 客户端不能只提供 String、byte[]、char[] 或 ByteBuffer?我相信这是非常低效的,我想了解为什么在这个世界上他们会以这种方式实施它。
我了解抽象数据类型和使用 Java 提供的工具(如 Comparable、Equals、Collections API 等)的优势。这是有道理的,我认为值得将其用于复杂的结构化数据,例如人员、帐户、交易等,但不适用于原始/原始数据类型。实在是太多了。