Do switch statements sound good to you?
Trust me better switch to Enum before it destroys your ears ;)

public class RepeaterSpecification {
@Test
public void repeatsInput() {
assertThat("value",is(repeat("value")));
}
@Test
public void repeatsEmptyInput() {
assertThat("",is(repeat("")));
}
//...
}
public class RepeaterSpecification {
@Test
public void repeatsInput() {
String input = "value";
assertThat(input,is(repeat(input)));
}
@Test
public void repeatsEmptyInput() {
String input = "";
assertThat(input,is(repeat(input)));
}
//...
}
It looks like we no longer have literal duplication. But unfortunately as you probably noticed, sometimes when fixing one type of duplication we generate another type of duplication. Keep reading to find out more... public class RepeaterSpecification {
@Test
public void repeatsInput() {
String input = "value";
assertThat(input,is(repeat(input)));
}
@Test
public void repeatsEmptyInput() {
String input = "";
assertThat(input,is(repeat(input)));
}
//...
}
public class RepeaterSpecification {
@Test
public void repeatsInput() {
assertThatInputIsRepeated("value");
}
@Test
public void repeatsEmptyInput() {
assertThatInputIsRepeated("");
}
private void assertThatInputIsRepeated(String input) {
assertThat(input,is(repeat(input)));
}
//...
}
public class TeamValidator {
public boolean isThereALeader(List<Members> team) {
Iterator<Member> iterator = team.getIterator();
while(iterator.hasNext()) {
Member member = iterator.next();
String role = member.getRole();
if(role.equals("Leader"))
return true;
}
return false;
}
public boolean areThereAtLeast2NewJoiners(List<Members> team) {
for(Member member:team) {
DateTime aMonthAgo = DateTime.now().minusMonths(1);
if(member.startingDate().isAfter(aMonthAgo))
return true;
}
return false;
}
//...
}
public class TeamValidator {
public boolean isThereALeader(List<Member> team) {
return new LeaderVerifier<Member>().evaluate(team);
}
public boolean areThereAtLeast2NewJoiners(List<Member> team) {
return new NewJoinersVerifier<Member>().evaluate(team);
}
}
public abstract class LoopEvaluator<T> {
public boolean evaluate(List<T> list) {
for (T element : list) {
if(evaluateElement(element)) {
return true;
}
}
return false;
}
public abstract boolean evaluateElement(T element);
}
public class LeaderVerifier<T extends Member> extends LoopEvaluator<T> {
@Override
public boolean evaluateElement(T element) {
return element.getRole().equals("leader");
}
}
public class NewJoinersVerifier<T extends Member> extends LoopEvaluator<T> {
private int newJoiners;
@Override
public boolean evaluate(List<T> list) {
this.newJoiners = 0;
return super.evaluate(list);
}
@Override
public boolean evaluateElement(T element) {
DateTime aMonthAgo = DateTime.now().minusMonths(1);
if(element.startingDate().isAfter(aMonthAgo))
this.newJoiners++;
return newJoiners == 2;
}
}