如果我有一个带有重载构造函数的客户类(默认值和带有params的客户类),在Overloaded构造函数中设置类成员的正确方法是什么?使用“this”引用还是使用setter方法?
只是不确定适当的方法是什么。
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;
}
}
答案 0 :(得分:27)
第一个(使用this.
)可能更安全,更直接。考虑未来的子类是否会覆盖setter方法 - 这可能会导致非常意外的行为。
如果你的课程是最终的,这是无关紧要的,这是一个洗手。
答案 1 :(得分:2)
它不是关于哪种方式更好的方法,而是你想要的......
- 如果您希望自己的班级为mutable
,请使用setters
。
- 如果您希望自己的课程为Immutable
,那么我认为使用this
是更好的选择。
我认为使用this
是适合的地方,您可以从网络服务器或某些来源收到一些数据,然后以自定义类的实例形式将它们存储到集合中......
<强>例如强>
创建班级学生
当您向某个网络服务发出请求时,您会收到的响应,例如: JSON
...
解析它,然后创建学生实例并将其存储在集合中..
例如:
ArrayList<Student> arList = new ArrayList<Student>();
arList.add(new Student(name,rollNos,class,marks));
答案 2 :(得分:1)
最好的答案是&#34;取决于&#34;。通常,除非setter在设置值之前执行更类似计算的操作,否则您不需要使用setter。但是,如果您的setter仅直接设置了值,则this
可能最适合您。相反,setter用于验证和填充,如果你使用this
,你就会错过它们。
答案 3 :(得分:0)
基本上,除了验证之外没有区别。
一方面,如果你的setter仅根据新值验证新值(它们不依赖于对象状态),则调用setter可以避免重复验证逻辑。
另一方面,如果一个setter的验证检查了其他属性,那么您必须确保在调用该setter之前已经设置了所需的属性,或者直接分配属性。
答案 4 :(得分:0)
直接访问方式更快(如果内存正确地为我提供了7倍的速度),但第二个是“更安全”,以防分配这些值或分配链接的某些特殊规则(从setter分配第二个字段)另一个)在访问器中实现的,当然,除非你想从构造函数完成赋值时明确地绕过那些规则/链接。
简而言之,这取决于您的需求,但这些是我能想到的主要问题。
答案 5 :(得分:0)
如前所述,在构造函数中调用可覆盖的方法是非常危险的。但是,如果你需要在setter中进行某种验证,你仍然有一些明智的方法来实现它。