班级最佳实践

时间:2012-09-07 20:12:04

标签: java

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

}

6 个答案:

答案 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中进行某种验证,你仍然有一些明智的方法来实现它。

  1. 让setter 最终。最快的解决方案。这个已经说明了,但它不是唯一的选择。
  2. 使用 setter的私有副本
  3. 使用工厂方法代替构造函数。我经常坚持这个。因为这样,如果验证失败并且它比(2)
  4. 更好地传达意图,您可以更自由地处理这种情况