21

如果我有一个带有重载构造函数的客户类(默认和一个带有参数),那么在 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;
}

}

4

6 回答 6

27

第一个(使用this.)可能更安全、更直接。考虑未来的子类是否会覆盖 setter 方法——这可能会导致非常意外的行为。

如果您的课程是最终课程,那么这无关紧要,而且是洗礼。

于 2012-09-07T20:16:36.593 回答
2

它不是关于哪个是更好的方法,而是你想从中得到什么......

-如果你想让你的班级成为mutable,那就去吧setters

-如果您希望您的班级成为,Immutable那么我认为使用this, 是一个更好的选择。

我认为使用this, 很适合您从网络服务器或某些来源接收一些数据,然后以自定义类的实例形式将它们存储到集合中.....

例如:

  • 创建班级学生,

  • 当您向某些 Web 服务发出请求时,您会得到响应,例如: JSON ...

  • 解析它,然后创建一个学生实例并将其存储在一个集合中。

    例如:

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

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

于 2012-09-07T20:25:57.907 回答
1

最好的答案是“取决于”。通常,您不需要使用 setter,除非 setter 在设置值之前执行更像计算的操作。但是,如果您的设置器仅直接设置值,那么this可能最适合您。相反,setter 用于验证和其他东西,如果你使用this,你会错过它们。

于 2012-09-07T20:18:34.887 回答
0

如前所述,在构造函数中调用可覆盖的方法是非常危险的。但是,如果您需要在 setter 中执行某种验证,您仍然有一些明智的方法来实现它。

  1. 制作二传手最终。最快的解决方案。这已经说明了,但它不是唯一的选择。
  2. 利用setter 的私有副本
  3. 使用工厂方法而不是构造函数。我通常坚持这个。因为如果验证失败并且它比(2)更好地传达意图,这样您就有更多的自由来处理这种情况
于 2012-09-07T21:16:35.107 回答
0

基本上,除了验证之外没有任何区别。

一方面,如果您的 setter 仅基于新值验证新值(它们不依赖于对象状态),则调用 setter 可避免重复验证逻辑。

另一方面,如果一个 setter 的验证检查了其他属性,那么您必须确保在调用该 setter 之前已经设置了所需的属性,或者直接分配属性。

于 2012-09-07T20:16:00.163 回答
0

直接访问方式更快(如果记忆正确,则速度快 7 倍),但第二种方式“更安全”,以防有一些特殊规则来分配这些值或分配链(您从另一个设置器中分配第二个字段)在访问器中实现的地方,除非您当然想在从构造函数完成分配时明确绕过这些规则/链接。

简而言之,这取决于您的需求,但这些是我能想到的主要问题。

于 2012-09-07T20:17:39.303 回答