Skip to content

Instantly share code, notes, and snippets.

@koher
Last active November 9, 2016 00:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koher/43e8de7d91c4a4596eb91d3dd945ffd6 to your computer and use it in GitHub Desktop.
Save koher/43e8de7d91c4a4596eb91d3dd945ffd6 to your computer and use it in GitHub Desktop.
import java.util.Arrays;
import java.util.List;
interface Integer {
int getValue();
}
final class ConcreteInteger implements Integer {
private final int value;
ConcreteInteger(int value) { this.value = value; }
@Override public int getValue() { return value; }
}
final class NullInteger implements Integer {
private static final NullInteger INSTANCE = new NullInteger();
private NullInteger() {}
static NullInteger getInstance() { return INSTANCE; }
@Override public int getValue() { return 0; }
}
interface Reducer {
Integer reduce(Integer initial, List<Integer> numbers);
}
final class SumReducer implements Reducer {
@Override public Integer reduce(Integer initial, List<Integer> numbers) {
Integer sum = initial;
for (final Integer number : numbers) {
sum = new ConcreteInteger(sum.getValue() + number.getValue());
}
return sum;
}
}
final class ProductReducer implements Reducer {
@Override public Integer reduce(Integer initial, List<Integer> numbers) {
Integer product = initial;
for (final Integer number : numbers) {
product = new ConcreteInteger(product.getValue() * number.getValue());
}
return product;
}
}
public class NullObjectIsDead {
public static void main(String[] args) {
final List<Integer> numbers = Arrays.asList(
new ConcreteInteger(2),
new ConcreteInteger(3),
new ConcreteInteger(5)
);
final List<Reducer> reducers = Arrays.asList(
new SumReducer(),
new ProductReducer()
);
for (final Reducer reducer : reducers) {
System.out.println(reducer.reduce(NullInteger.getInstance(), numbers).getValue());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment