Como sobreviver sem repetição de código no reino dos substantivos?
O que fazer quando encontramos código deste tipo:
A.java
Button button = new Button("Limpar");
button.addActionListener(new ActionListener() {
public void performAction() {
if (foo) {
askConfirmation();
bar.clear();
}
}
});
B.java
Button button = new Button("Limpar");
button.addActionListener(new ActionListener() {
public void performAction() {
if (bacon) {
askConfirmation();
eggs.clear();
}
}
});
C.java
Button button = new Button("Limpar");
button.addActionListener(new ActionListener() {
public void performAction() {
if (baz) {
askConfirmation();
spam.clear();
}
}
});
Meu jeito é criar um verbo disfarçado de substantivo que leva consigo a ação que eu quero:
interface MagicClearWord {
boolean isDirty();
void clear();
}
class MagicClearWordExecutor implements ActionListener {
private final MagicClearWord e;
MagicClearWordExecutor(MagicClearWord e) {
this.e = e;
}
public void performAction() {
if (e.isDirty()) {
askConfirmation();
e.clear();
}
}
}
E depois utilizar como se fosse um "substantivo anônimo" (#nonsense):
A.java
Button button = new Button("Limpar");
button.addActionListener(new MagicClearWordExecutor(
new MagicClearWord() {
public boolean isDirty() {
return foo;
}
public void clear() {
bar.clear();
}
})
);
B.java
Button button = new Button("Limpar");
button.addActionListener(new MagicClearWordExecutor(
new MagicClearWord() {
public boolean isDirty() {
return bacon;
}
public void clear() {
eggs.clear();
}
})
);
C.java
Button button = new Button("Limpar");
button.addActionListener(new MagicClearWordExecutor(
new MagicClearWord() {
public boolean isDirty() {
return baz;
}
public void clear() {
spam.clear();
}
})
);
Ainda assim os substantivos e seus amigos gulosos comem seu tempo e seu espaço em disco com tanta palavra vazia. Parece que estamos presos mesmo.
Oh God, why?