设计 getter 和 setter 的最佳方法是什么?为什么?

What is the best way to design getters and setters and why?

我想知道编写 getter 和 setter 的最佳方式是什么?

我们应该在 getter 中检查条件还是应该在 setter 中检查?

这样做的标准程序是什么?为什么?

假设我有一个class产品:(这只是一个例子,只问设计getters和setters的方法)

public class Product {
private String productName;

public String getProductName() {
    if (productName != null || !productName.equals("")){
        return productName;
    }else {
        return "Product Name Not found";
    }
}
public void setProductName(String productName) {
    String productName2 = productName;
    if (productName != null || !productName2.equals("")){
        this.productName = productName;
    }else {
        this.productName = "Product Name Not found";
    }
 }
}

建议:

public class Product {
  private String productName;

  public Product(String productName) {
    this.productName = productName;
  }

  public String getProductName() {
    return this.productName;
  }

  public void setProductName(String productName) {
    this.productname = productName;
  }

理由:

  1. 一般来说,成员数据应该是私有的(例如:"private String productName")

  2. 如果"outsiders"需要读取成员,提供getter方法。

  3. 如果"outsiders"需要修改成员,提供"setting"方法。将验证码添加到您的 setter 是合适的。如果验证失败,抛出异常通常是一个好习惯。

  4. 一般来说,如果你可以在构造函数中初始化一些东西,你应该。更具体地说,"constructor" 的目的是为 class.

  5. 建立“invariant conditions

'希望对您有所帮助!

备注:

  • 如果您正在编写一个 Java Bean,您可能需要一个 "no args" 构造函数。在那种情况下,添加一个"init()"方法来代替我上面描述的构造函数。

  • 一次初始化多个成员是非常合适的 - 无论是在您的构造函数中,还是在自定义 "init()".

在setter。 getter 已经太晚了。尽快捕获错误。 使它成为一个错误,而不仅仅是“我不知道”的情况:你永远不应该允许对象进入无效状态。

public class Product {
  private String productName;

  public Product(String productName) {
    setProductName(productName); // for validation
  }

  public String getProductName() {
    return this.productName;
  }

  public void setProductName(String productName) {
    if (productName == null || productName.length() == 0)
        throw new IllegalArgumentException("product name cannot be null or empty");
    this.productname = productName;
  }