用时间刻度表示的不同类型数据的Java数据结构设计

时间:2017-04-07 14:58:59

标签: java oop

我正试图摆脱面向对象的设计并遇到一个我发现很奇怪的问题,而且我不确定构建数据的好策略。

我正在访问的API提供如下数据:

<pair_name> = pair name
    a = ask array(<price>, <whole lot volume>, <lot volume>),
    b = bid array(<price>, <whole lot volume>, <lot volume>),
    c = last trade closed array(<price>, <lot volume>),
    v = volume array(<today>, <last 24 hours>),
    p = volume weighted average price array(<today>, <last 24 hours>),
    t = number of trades array(<today>, <last 24 hours>),
    l = low array(<today>, <last 24 hours>),
    h = high array(<today>, <last 24 hours>),
    o = today's opening price

来源:https://www.kraken.com/help/api#get-tradable-pairs

我在解决如何处理问题时遇到的问题是array(<today>, <last 24 hours>)位。我希望有一个符合这个要求的结构。我将它们分为Volume,TotalTrades和HighLow对象(或类似的东西),但今天/过去24小时的类型各不相同(有时int有时double。)

我以为我会尝试这两个:

public abstract class DayTimeFrameData {
    protected Object today;
    protected Object lastTwentyFourHours;
}

或类似的东西:

public interface DayTimeFrameData {
    Object today = null;
    Object lastTwentyFourHours = null;
}

然后为每种数据类型扩展/实现其中一种。但我不确定这些是否有任何意义。

有人可以给我一些关于如何构建这样的东西的指示吗?

1 个答案:

答案 0 :(得分:1)

接口指定方法但不指定字段,因此您无法使用该方法。你可以使用这样的东西:

public class DayTimeFrameData {
    protected double today;
    protected double lastTwentyFourHours;
}

因为double也可以表示整数。然后只需使用此类型的对象作为字段。

public class PairInfo {
    protected DayTimeFrameData volume;
    protected DayTimeFrameData numberOfTrades;
    protected DayTimeFrameData low;
}

但是,如果每个方法都需要自己的特定方法,那么您可能确实将DayTimeFrameData抽象化并为每种类型扩展它。例如:

public class NumberOfTrades extends DayTimeFrameData {
    /* methods and fields specific to NumberOfTrades */
}

如果您希望将字段类型限制为特定实现的Double或Integer,则可以使用泛型:

public abstract class DayTimeFrameData<T extends Number, L extends Number> {
    protected T today;
    protected L lastTwentyFourHours;
}

然后,实现可以指定允许哪些类型。

public class NumberOfTrades extends DayTimeFrameData<Integer, Double> {
    /* methods and fields specific to NumberOfTrades */
}

以上说明today值为整数,lastTwentyFourHours值为Double。如果它们总是需要是相同的类型,则可以在DayTimeFrameData上使用一个类型参数。请注意,在这种情况下,我们需要使用包装器类型(Double,Integer)而不是基本类型(double,int)。