sclass RollingAverage { int windowSize = 50; int recalcEvery = 1000; // to counter floating point errors new LinkedList list; double sum; int n; *() {} *(int *windowSize) {} synchronized void add(double d) { if (++n >= recalcEvery) { n = 0; sum = doubleSum(list); } if (l(list) >= windowSize) sum -= popFirst(list); list.add(d); sum += d; } synchronized double get() { ret doubleRatio(sum, l(list)); } }