Лучшая практика класса
Если у меня есть класс клиента с перегруженным конструктором (по умолчанию и один с параметрами), каков правильный способ установки членов класса в 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;
}
}
Ответы
Ответ 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)