jtulach@325: package org.apidesign.sidemeanings.math; jtulach@325: jtulach@325: /** Rewrite of original jtulach@325: * jtulach@325: * Arithmetica jtulach@325: * class from the composition project jtulach@325: * to follow the eliminate fuzzy modifiers rule. jtulach@325: * jtulach@325: * @author Jaroslav Tulach jtulach@325: * @version 5.0 jtulach@325: */ jtulach@325: // BEGIN: design.sidemeanings.arith jtulach@325: public abstract class Arithmetica { jtulach@325: // BEGIN: design.sidemeanings.arith.sumTwo jtulach@325: public final int sumTwo(int one, int second) { jtulach@325: return overridableSumTwo(one, second); jtulach@325: } jtulach@325: protected abstract int overridableSumTwo(int one, int second); jtulach@325: protected final int defaultSumTwo(int one, int second) { jtulach@325: return one + second; jtulach@325: } jtulach@325: // END: design.sidemeanings.arith.sumTwo jtulach@325: jtulach@325: public final int sumAll(int... numbers) { jtulach@325: return overridableSumAll(numbers); jtulach@325: } jtulach@325: protected abstract int overridableSumAll(int... numbers); jtulach@325: protected final int defaultSumAll(int... numbers) { jtulach@325: if (numbers.length == 0) { jtulach@325: return 0; jtulach@325: } jtulach@325: int sum = numbers[0]; jtulach@325: for (int i = 1; i < numbers.length; i++) { jtulach@376: // do I want to call sumTwo or defaultSumTwo? jtulach@376: // That is a question! jtulach@325: sum = openUpToSubclasses() ? jtulach@325: sumTwo(sum, numbers[i]) : jtulach@325: defaultSumTwo(sum, numbers[i]); jtulach@325: } jtulach@325: return sum; jtulach@325: } jtulach@325: jtulach@325: public final int sumRange(int from, int to) { jtulach@325: return overridableSumRange(from, to); jtulach@325: } jtulach@325: protected abstract int overridableSumRange(int from, int to); jtulach@325: protected final int defaultSumRange(int from, int to) { jtulach@325: int len = to - from; jtulach@325: if (len < 0) { jtulach@325: len = -len; jtulach@325: from = to; jtulach@325: } jtulach@325: int[] array = new int[len + 1]; jtulach@325: for (int i = 0; i <= len; i++) { jtulach@325: array[i] = from + i; jtulach@325: } jtulach@325: // BEGIN: design.sidemeanings.arith.the.question jtulach@325: // Again, an API author has to ask what sumAll one wants to call? jtulach@325: // Am I about to open up to subclasses or do I want default impl? jtulach@325: return openUpToSubclasses() ? jtulach@325: sumAll(array) : jtulach@325: defaultSumAll(array); jtulach@325: // END: design.sidemeanings.arith.the.question jtulach@325: } jtulach@325: jtulach@325: boolean openUpToSubclasses = true; jtulach@325: boolean openUpToSubclasses() { jtulach@325: return openUpToSubclasses; jtulach@325: } jtulach@325: jtulach@325: jtulach@325: // BEGIN: design.sidemeanings.arith.factory jtulach@325: public static Arithmetica create() { jtulach@325: return new Arithmetica.Impl(); jtulach@325: } jtulach@325: private static class Impl extends Arithmetica { jtulach@325: @Override jtulach@325: protected int overridableSumTwo(int one, int second) { jtulach@325: return defaultSumTwo(one, second); jtulach@325: } jtulach@325: jtulach@325: @Override jtulach@325: protected int overridableSumAll(int... numbers) { jtulach@325: return defaultSumAll(numbers); jtulach@325: } jtulach@325: jtulach@325: @Override jtulach@325: protected int overridableSumRange(int from, int to) { jtulach@325: return defaultSumRange(from, to); jtulach@325: } jtulach@325: } jtulach@325: // END: design.sidemeanings.arith.factory jtulach@325: jtulach@325: } jtulach@325: // END: design.sidemeanings.arith