0

我想在TA-Lib中实现以下类的所有 cdl(烛台图案)方法 。

大约有 61 种 cdl 分析方法,其中大约 90% 具有相似的签名,只是它们的核心实现不同。

例如:

 public RetCode cdl2Crows(int startIdx,
      int endIdx,
      double inOpen[],
      double inHigh[],
      double inLow[],
      double inClose[],
      MInteger outBegIdx,
      MInteger outNBElement,
      int outInteger[])


public RetCode cdl3BlackCrows(int startIdx,
      int endIdx,
      double inOpen[],
      double inHigh[],
      double inLow[],
      double inClose[],
      MInteger outBegIdx,
      MInteger outNBElement,
      int outInteger[])

我在想是否可以将方法名称作为源类的参数传递,然后使用反射调用方法以避免重复代码

public invokeAnalytic(String analyticMethodName, common params .....)
{
    // using reflection invoke analyticMethodName of Core class
    // and pass rest of the params
}
  1. 在这种情况下,Java 中最好的设计模式是什么?
  2. 如果我在这种情况下使用反射,会不会出现性能问题?
4

5 回答 5

2

将参数包装在不可变的值对象中怎么样?

例如

MyValueObject params = new MyValueObject(int startIdx,
    int endIdx,
    double inOpen[],
    double inHigh[],
    double inLow[],
    double inClose[],
    MInteger outBegIdx,
    MInteger outNBElement,
    int outInteger[]);

// ....
someObject.cdl2Crows(params);
// ...
someObject.cdl3BlackCrows(params);
于 2012-11-16T18:59:28.790 回答
1
public interface CDL

    public RetCode invoke
    (
          int startIdx,
          int endIdx,
          double inOpen[],
          double inHigh[],
          double inLow[],
          double inClose[],
          MInteger outBegIdx,
          MInteger outNBElement,
          int outInteger[]
    );

static Map<String,CDL> map = new HashMap<>();


map.put("cdl2Crows", new CDL()
{ 
    public RetCode invoke(...)
    { 
        impl... 
    }
});
...
于 2012-11-16T19:12:34.600 回答
1

创建公共数据点的最终类(类似于 C 中的结构)并将其作为参数传递给您的函数。它有点重,但并不像你想象的那么糟糕(尤其是在声明类的情况下final)。

于 2012-11-16T18:58:21.990 回答
0

在这种情况下应该避免反射,因为您将失去安全性和性能,而不必多输入。

在这种情况下,我只使用基于方法签名相同/实现细节共享位置的接口层次结构或抽象类。

于 2012-11-16T18:55:54.197 回答
0

我认为策略模式是您最好的选择:

http://java.dzone.com/articles/design-patterns-strategy

于 2012-11-16T20:01:09.453 回答