java - 在 Java 中用原语规避代码膨胀的模式

标签 java performance design-patterns primitive boxing

大家好 Stackoverflowers,

我有以下问题:

我有一种情况,我得到一个原始数字数组作为输入。例如 int[] 或 short[] 甚至 byte[]。现在,我需要遍历代码并做一些事情,例如,将数字写入列表。然而,问题是每种类型的数字都需要一个特定的列表。没问题,我想,并尝试使用泛型:

Object dataSet = provider.getDataArray();
Number[] copy = new Number[Array.getLength(dataSet)];
for(int i= 0; i < Array.getLength(dataSet); i++) {
    copy[i] = (T) Array.get(dataSet, i);
}

这很好用。但是,问题在于性能。我知道这是无法避免的,因为反射和发生的基元装箱代价高昂。我现在正在寻找一种模式来减少代码量,因为写

Object dataSet = provider.getDataArray();
Class<? extends Number> dataType = provider.getDataType();

Number[] copy = new Number[dataSet.length];
if(dataType == Float.class) 
    float[] dataSetAsFloat = (float[]) dataSet;
    for(int i= 0; i < dataSet.length; i++) 
        copySet[i] = dataSetAsFloat[i];
else if (dataType == Double.class)
    double[] dataSetAsDouble = (double[]) dataSet;
    for(int i= 0; i < dataSet.length; i++) 
        copySet[i] = dataSetAsFloat[i];    
....

是一个非常臃肿的解决方案,因为我正在编写的程序中的应用程序并不像这里显示的那么简单。基本上,由于这个性能问题,我创建了几百行额外的代码。有针对这个的解决方法吗?也许是我不知道的模式,或者我没有看到的一些非常简单的技巧?

如有回复,我将不胜感激。

谢谢。

最佳答案

你考虑过根据数据类型选择转换策略的策略模式吗?虽然它不会减少整体代码的大部分,但有助于模块化它。

public interface ArrayConversionStrategy<T extends Number> {
    T[] convertArray
}

public class FloatConversionStrategy implements ArrayConversionStrategy<Float>
   float[] convertArray(Object[] dataset) {
     float[] dataSetAsFloat = new float[dataset.length];
      for(int i= 0; i < dataSet.length; i++) 
        dataSetAsFloat [i] = dataset[i];
  }
}

public class DoubleConversionStrategy { ... }
public class LongConversionStrategy { ... }

然后在调用类中有一个数据类型到策略的映射

Map<Class<? extends Number>, ArrayConversionStrategy> map;

Object[] dataSet =    provider.getDataArray();
Class<? extends Number> dataType = provider.getDataType();
ArrayConversionStrategy strategy = map.get(dataType)
return strategy.convertArray(dataSet);

我的一些通用语法可能不在这里,并且可能需要进行一些装箱/自动拆箱,但作为一般策略,这可能很有用。

关于java - 在 Java 中用原语规避代码膨胀的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333784/

相关文章:

java - 如何重写以下rx-java爬虫

java - 在您自己的代码库中,类别名是一种不好的做法吗?

performance - mzscheme 中的 I/O 性能

实体和管理器抽象的 C++ 设计

wcf - 在其他 Web 服务之上构建 Web 服务是否明智?

java - 小挑战。比较 3 个单独数组的总和

java - CHECK_NRPE : Error - Could not complete SSL handshake (web)

performance - 检查Perl中$ string是否以$ needle开头的最有效方法

Java降低CPU使用率

image - SVG路径: pattern fill not working in firefox and Safari