Подтвердить что ты не робот

Лучшая практика класса

Если у меня есть класс клиента с перегруженным конструктором (по умолчанию и один с параметрами), каков правильный способ установки членов класса в Overloaded constructor? Используя ссылки "this" или используя методы настройки?

Просто не был уверен, какой был правильный метод.

public class Customer {

private String firstName;
private String lastName;
private int age;

public Customer() {}

//This Way
public Customer(String firstName, String lastName, int age)
{
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
}

// Or this way?
  public Customer(String firstName, String lastName, int age)
{
    setFirstName(firstName); 
    setLastName(lastName);
    setAge(age);
}



/**
 * @return the firstName
 */
public String getFirstName() {
    return firstName;
}

/**
 * @param firstName the firstName to set
 */
public void setFirstName(String firstName) {
    this.firstName = firstName;
}

/**
 * @return the lastName
 */
public String getLastName() {
    return lastName;
}

/**
 * @param lastName the lastName to set
 */
public void setLastName(String lastName) {
    this.lastName = lastName;
}

/**
 * @return the age
 */
public int getAge() {
    return age;
}

/**
 * @param age the age to set
 */
public void setAge(int age) {
    this.age = age;
}

}

4b9b3361

Ответ 1

Первый (с использованием this.), вероятно, более безопасен и более прост. Подумайте, изменил ли будущий подкласс методы сеттера - это может вызвать очень неожиданное поведение.

Если ваш класс является окончательным, это не имеет значения, и это стирка.

Ответ 2

Не о том, что это лучший способ сделать это, но что вы хотите от него......

- Если вы хотите, чтобы ваш класс был mutable, перейдите к setters.

- Если вы хотите, чтобы ваш класс был Immutable, я думаю, что использование this - лучший вариант.

Я думаю, что использование this, возможно в местах, где вы получаете некоторые данные с веб-сервера или какого-либо источника, а затем храните их в коллекции в форме экземпляров пользовательского класса.....

Например:

  • Создайте ученика класса,

  • Как вы делаете запрос к некоторому веб-сервису, вы получите ответ для например: JSON...

  • Разберите его, затем создайте экземпляр студента и сохраните его в коллекции.

    например:

    ArrayList<Student> arList = new ArrayList<Student>();

    arList.add(new Student(name,rollNos,class,marks));

Ответ 3

Лучший ответ будет "зависит". Как правило, вам не нужно использовать сеттеры, если сеттеры не делают что-то большее, чем вычисление, прежде чем устанавливать значение. Однако, если ваши сеттеры устанавливают значение непосредственно, то this, вероятно, лучше всего подходит для вас. Напротив, сеттеры используются для проверки и прочее, если вы используете this, вы пропустите их.

Ответ 4

В принципе, нет никакой разницы, кроме проверки.

С одной стороны, если ваш сеттер проверяет новые значения, основанные только на новых значениях (они не зависят от состояния объекта), вызов setter позволяет избежать дублирования логики проверки.

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

Ответ 5

Режим прямого доступа выполняется быстрее (в 7 раз быстрее, если память мне правильна), а вторая - "безопаснее", если некоторые специальные правила назначают эти значения или цепочки присвоения (где вы назначаете второе поле из сеттера другого), где реализовано в аксессорах, то есть, если, конечно, вы не хотите, чтобы экспликация обходила эти правила/цепочки, когда назначение выполняется из конструктора.

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

Ответ 6

Как уже было сказано, довольно сложно вызвать переопределяемые методы в конструкторе. Однако, если вам нужно выполнить какую-то проверку, которая имеет место в сеттере, у вас все еще есть несколько разумных способов ее достижения.

  • Сделать сеттер окончательным. Быстрое решение. Это уже сказано, но это не единственный вариант.
  • Используйте личную копию установщика.
  • Используйте factory метод вместо конструктора. Я обычно придерживаюсь этого. Потому что таким образом у вас есть больше свободы для обработки ситуации, если проверка не выполняется, и она сообщает намерения лучше, чем (2)