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?