Наличие большого количества параметров в конструкторе - PullRequest
24 голосов
/ 01 ноября 2011

Разве неправильно иметь много параметров внутри конструктора?Как от 10 до 15 параметров?Потому что я проектировал класс, в котором конструктор будет иметь много параметров, например, класс Person.

Мой пример класса персонажа имеет 6 параметров в своем конструкторе:

public class Person {
    private String fName;
    private String lName;
    private String mInitial;
    private int age;
    private String contactNumber;
    private String emailAddress;

    public Person(String fName, String lName, String mInitial, int age, String contactNumber, String emailAddress) {
       //insert rest of code here 
    }
}

Это неправильно?Создание множества параметров для конструктора?

Затем я планирую создать класс с именем Employee, затем расширить его до класса person, тогда у него также будет длинный конструктор.

Что меня беспокоит, так это практика, это хорошо или как?Любые другие предложения?

Ответы [ 4 ]

21 голосов
/ 01 ноября 2011
  1. В общем, если у вас слишком много параметров, это означает, что у вас недостаточно классов низкого уровня. В вашем случае вы можете иметь class Name { /* fname, lname, initial, */ } и, возможно, class Contact { /* email, phone */ }

  2. Когда вы расширяете свой класс, пусть конструктор принимает базу как один параметр, а затем добавляет новые дополнительные параметры. (Вы, вероятно, имеете в виду, что Employee будет расширять Person, а не наоборот, поэтому public Employee (Person person, Company company, String employeeId) { super(person); this.company = company; this.employeeId = employeeId; }

Хороший вопрос!

12 голосов
/ 01 ноября 2011

Вместо использования шаблон телескопического конструктора , используйте шаблон конструктора

public class Person {
    private final String fName;
    private final String lName;
    private final String mInitial;
    private final int age;
    private final String contactNumber;
    private final String emailAddress;

    public Person(PersonBuilder builder) {
       //insert rest of code here 
       fName = builder.fName;
       ...
    }

    public static class PersonBuilder {
        private String fName;
        private String lName;
        private String mInitial;
        private int age;
        private String contactNumber;
        private String emailAddress;
        // setter methods
        public PersonBuilder setFirstName(String name) {
             fName = name;
             return this;
        }
        ...
        // build method
        public Person build() {
            return new Person(this);
        }

    }
}

...

Person p = new PersonBuilder()
              .setFirstName("")
              // set all the setter methods
              .build();
10 голосов
/ 01 ноября 2011

Вы можете разложить Person на Name и Contact.

public class ComposedPerson {
    private Name name;
    private int age;
    private Contact contact;

    public ComposedPerson(Name name, int age, Contact contact) {
        this.name = name;
        this.age = age;
        this.contact = contact;
    }

    public static void main(String... args) {
        Name name = new Name("John");
        Contact contact = new Contact("12345", "john@doe.com");
        ComposedPerson person = new ComposedPerson(name, 45, contact);
   }

Образец Name. Посмотрите, как я использую телескопический конструктор, чтобы учесть необязательные аргументы.

public class Name {
    private String fName;
    private String lName;
    private String mInitial;

    public Name(String fName) {
        this(fName, null, null);
    }

    public Name(String fName, String lName) {
        this(fName, lName, null);
    }

    public Name(String fName, String lName, String mInitial) {
        this.fName = fName;
        this.lName = lName;
        this.mInitial = mInitial;
    }
} 
3 голосов
/ 01 ноября 2011

Да, нехорошо иметь много параметров в любых функциях. Максимальные параметры должны быть около 7, согласно книге под названием Code Complete 2.

Это потому, что это уменьшит код удобочитаемость и удобство обслуживания и удобство использования . Представьте себе других разработчиков, работающих над тем же проектом, как следовать вашему коду?

Есть много разных способов справиться с этим, например, фабричный шаблон. Это зависит от того, как вы разрабатываете свое приложение.

Но в вашем коде, я думаю, это нормально, что нет. параметры все еще приемлемы (6 параметров)

Если вашему объекту требуется столько параметров для создания экземпляра, то вам необходимо переосмыслить, как вы разрабатываете свой код. Например, могут ли некоторые атрибуты обернуться в отдельный класс? некоторые атрибуты не обязательно передавать в качестве параметра? т.е. получить значение из другого класса. и т.д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...