IntelliJ 8: Introduce Parameter Refactoring

IntelliJ 8 provides 7 new refactorings. One new powerful refactoring is the Introduce Parameter Object. The name speaks for itself: it introduces a parameter object! But what does it really do? The refactoring promotes good encapsulation. It encapsulates fields by introducing a new object for them.

For example, you might encounter or write the following piece of code:

public class Parser {
    public void parse(String firstName, String lastName) {
       // firstName and lastName handling here
    }

    public void testParser() {
        new Parser().parse("erik", "pragt");
    }
}

The method call consists of two Strings, but a better approach might be to encapsulate those fields into a new class, for example 'Name'. This refactoring does exactly that. Just select the 'parse' method, go to Refactor -> Introduce Parameter Object, which will look like:

public class Name {
    private final String firstName;
    private final String lastName;

    public Name(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}

public class Parser {
    public void parse(Name name) {
      // name handling here
    }

    public void testParser() {
        new Parser().parse(new Name("erik", "pragt"));
    }
}

After refactoring, you're code will look like this, which is a much better typed version of the previous one!

Comments (7)

  1. Vikas Hazrati - Reply

    November 7, 2008 at 12:46 am

    Eclipse has it 🙂

    Select the parameters, Alt+Shft+T --> Introduce Parameter Object

  2. Erik Pragt - Reply

    November 7, 2008 at 8:58 am

    Oh!!! Just wait for the next blog!!

  3. raveman - Reply

    November 7, 2008 at 9:44 am

    I bet IntelliJ had that feature first 😛 lol

  4. Erik Pragt - Reply

    November 7, 2008 at 10:17 am

    Well, ehhmm,...this is a *new* refactoring... But I guess it's good that IntelliJ finally borrows something back! 😉

  5. florin - Reply

    November 7, 2008 at 6:16 pm

    And then you have to introduce another "Parameter Object" to the Name class that will take two parameters:

    @Constructor
    public Person(PersonParameters parameters) {
    this.firstName = parameters.getFirstName();
    this.lastName = parameters.getLastName();
    }

    with resulting code:
    parser = new Parser(new Name(parameters));

    etc...

    is @Re-curse a reserved annotation or a keyword to be filtered?

    I love it.

  6. Aziz Kadhi - Reply

    November 7, 2008 at 9:39 pm

    Which version are you using? I am using 8.0M1 and I don't seem to be able to find it.

    Thanks

  7. Aziz Kadhi - Reply

    November 7, 2008 at 9:42 pm

    Never mind. I have just learned that the final 8.0 release is out.

Add a Comment