1 package org.apidesign.sidemeanings.math;
3 /** Rewrite of original
4 * <a href="http://source.apidesign.org/hg/apidesign/diff/4e59b6b0e907/samples/composition/src-api1.0/org/apidesign/math/Arithmetica.java">
6 * class from the composition project
7 * to follow the <q>eliminate fuzzy modifiers</q> rule.
9 * @author Jaroslav Tulach <jtulach@netbeans.org>
12 // BEGIN: design.sidemeanings.arith
13 public abstract class Arithmetica {
14 // BEGIN: design.sidemeanings.arith.sumTwo
15 public final int sumTwo(int one, int second) {
16 return overridableSumTwo(one, second);
18 protected abstract int overridableSumTwo(int one, int second);
19 protected final int defaultSumTwo(int one, int second) {
22 // END: design.sidemeanings.arith.sumTwo
24 public final int sumAll(int... numbers) {
25 return overridableSumAll(numbers);
27 protected abstract int overridableSumAll(int... numbers);
28 protected final int defaultSumAll(int... numbers) {
29 if (numbers.length == 0) {
33 for (int i = 1; i < numbers.length; i++) {
34 // do I want to call sumTwo or defaultSumTwo?
35 // That is a question!
36 sum = openUpToSubclasses() ?
37 sumTwo(sum, numbers[i]) :
38 defaultSumTwo(sum, numbers[i]);
43 public final int sumRange(int from, int to) {
44 return overridableSumRange(from, to);
46 protected abstract int overridableSumRange(int from, int to);
47 protected final int defaultSumRange(int from, int to) {
53 int[] array = new int[len + 1];
54 for (int i = 0; i <= len; i++) {
57 // BEGIN: design.sidemeanings.arith.the.question
58 // Again, an API author has to ask what sumAll one wants to call?
59 // Am I about to open up to subclasses or do I want default impl?
60 return openUpToSubclasses() ?
63 // END: design.sidemeanings.arith.the.question
66 boolean openUpToSubclasses = true;
67 boolean openUpToSubclasses() {
68 return openUpToSubclasses;
72 // BEGIN: design.sidemeanings.arith.factory
73 public static Arithmetica create() {
74 return new Arithmetica.Impl();
76 private static class Impl extends Arithmetica {
78 protected int overridableSumTwo(int one, int second) {
79 return defaultSumTwo(one, second);
83 protected int overridableSumAll(int... numbers) {
84 return defaultSumAll(numbers);
88 protected int overridableSumRange(int from, int to) {
89 return defaultSumRange(from, to);
92 // END: design.sidemeanings.arith.factory
95 // END: design.sidemeanings.arith