我正试图摆脱面向对象的设计并遇到一个我发现很奇怪的问题,而且我不确定构建数据的好策略。
我正在访问的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;
}
然后为每种数据类型扩展/实现其中一种。但我不确定这些是否有任何意义。
有人可以给我一些关于如何构建这样的东西的指示吗?
答案 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)。