返回

Setter方法的返回值:

java

使用“this”作为 Setter 方法的返回值:利弊和替代方案

引言

在 Java 编程中,关于 Setter 方法是否应该返回“this”对象的问题引发了激烈的争论。支持者认为这提供了简洁性和链接调用的便利性,而反对者则指出违反约定和潜在的混淆问题。本文将深入探讨使用“this”作为 Setter 方法返回值的利弊,并提供替代解决方案。

返回“this”的优点

返回“this”的主要优点是可以链接 Setter 方法调用。这简化了创建和初始化对象的语法,从而允许以下链式调用:

Employee e = new Employee()
  .setName("Jack Sparrow")
  .setId(1)
  .setFoo("bacon!");

相比之下,如果不返回“this”,则需要使用更冗长的语法:

Employee e = new Employee();
e.setName("Jack Sparrow");
e.setId(1);
e.setFoo("bacon!");

返回“this”的缺点

返回“this”也有一些缺点需要注意:

  • 违反约定: 违背了 JavaBeans 惯例,其中规定 Setter 方法不应具有返回值。
  • 混淆: 开发人员可能不期望 Setter 方法返回任何内容,这可能会导致混淆。
  • 调试困难: 返回“this”会使调试更具挑战性,因为很难跟踪 Setter 方法调用的顺序。

替代解决方案

如果您希望链接 Setter 方法调用,可以使用 Builder 模式 。Builder 模式创建了一个分步构建对象的类,允许您按顺序设置属性。例如,您可以创建一个 EmployeeBuilder 类:

public class EmployeeBuilder {

  private Employee employee;

  public EmployeeBuilder() {
    this.employee = new Employee();
  }

  public EmployeeBuilder setName(String name) {
    this.employee.setName(name);
    return this;
  }

  public EmployeeBuilder setId(int id) {
    this.employee.setId(id);
    return this;
  }

  public EmployeeBuilder setFoo(String foo) {
    this.employee.setFoo(foo);
    return this;
  }

  public Employee build() {
    return this.employee;
  }
}

然后,您可以使用 Builder 模式创建和初始化一个 Employee 对象:

Employee e = new EmployeeBuilder()
  .setName("Jack Sparrow")
  .setId(1)
  .setFoo("bacon!")
  .build();

结论

使用“this”作为 Setter 方法的返回值既有优点也有缺点。最终,最佳实践取决于您的个人偏好和特定情况。如果您正在使用返回“this”的框架或库,则建议遵循其约定。否则,最好避免返回“this”,以防止混淆和调试问题。Builder 模式提供了链接 Setter 方法的好处,同时避免了使用“this”的缺点。

常见问题解答

  1. 是否始终应该使用 Builder 模式来链接 Setter 方法?
    这不是必须的,但它是一种有效的方法,可以简化对象创建并避免“this”返回的问题。

  2. 为什么 Builder 模式被称为“模式”?
    因为它提供了一个创建对象的模板,类似于设计模式的概念。

  3. 除了 Builder 模式之外,还有哪些其他替代方案可以链接 Setter 方法?

  4. 是否可以使用“this”返回 Setter 方法以创建不可变对象?
    可以,但它不是创建不可变对象的推荐方法。使用不可变类或 Immutable Builder 模式更合适。

  5. 是否可以返回其他对象来连接 Setter 方法?
    是的,您可以在链接中使用任何类型的对象。不过,返回“this”或 Builder 对象通常是最惯用的方法。