Search code examples
javadesign-patternsjava-8refactoringdry

Dynamically find the correct method in order to not repeat the same code


The following code adds Listeners to several SWT Text elements. The only difference is the code inside the Listeners method. Is there a way to make this code less repetitive by finding the correct method to use dynamically?

In this example a FocusListener is used, but it's not relevant.

private void addFocusLostListeners() {
    nameText.addFocusListener(new FocusListener() {
        @Override
        public void focusGained(FocusEvent e) {}
        @Override
        public void focusLost(FocusEvent e) {
            myDataObject.setName(nameText.getText());
        }
    });
    ageText.addFocusListener(new FocusListener() {
        @Override
        public void focusGained(FocusEvent e) {}
        @Override
        public void focusLost(FocusEvent e) {
            myDataObject.setAge(ageText.getText());
        }
    });
    emailText.addFocusListener(new FocusListener() {
        @Override
        public void focusGained(FocusEvent e) {}
        @Override
        public void focusLost(FocusEvent e) {
            myDataObject.setEmail(emailText.getText());
        }
    });
    ...
}

Solution

  • You could make a helper method (you need to replace TextField with the actual class of nameText, ageText, etc.):

    private static void addFocusListener(TextField field, Consumer<? super String> setter) {
        field.addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {}
            @Override
            public void focusLost(FocusEvent e) {
                setter.accept(field.getText());
            }
        });
    }
    

    Which you then could call:

    private void addFocusLostListeners() {
        addFocusListener(nameText, myDataObject::setName);
        addFocusListener(ageText, myDataObject::setAge);
        addFocusListener(emailText, myDataObject::setEmail);
    }