1. 引言

开发人员在编程时会面临一个选择:是使用setter方法还是构造函数来设置变量的值。这两种方法各有优势,但它们适用于不同的场景。

在这篇教程中,我们将讨论在Java中何时使用setter方法或构造函数来设置变量的值。

2. 使用setter方法

setter方法是我们可以用来在Java类中设置实例变量的函数。它们提供了一种灵活的方式来修改对象初始化后状态的方式。使用setter方法设置的实例变量不能声明为final,因为可以在对象初始化后更改其值。

让我们考虑一个Web应用中用户类的现实世界例子:

public class User {
    private String username;
    private String password;

    public void setUsername(String username) {
        // Validate username format
        if (username.matches("[a-zA-Z0-9_]+")) {
            this.username = username;
        } else {
            throw new IllegalArgumentException("Invalid username format");
        }
    }

    // Other methods...
}

在这个例子中,User类封装了Web应用的用户数据。setUsername()setPassword()方法分别用于设置usernamepassword。这些方法还会进行验证,确保用户名符合特定格式且密码满足某些强度要求。

让我们测试setter方法,为User对象设置username

@Test
void givenNewUser_whenSettingUsername_thenUsernameIsSet() {
    User user = new User();
    user.setUsername("john_doe");
    assertEquals("john_doe", user.getUsername());
}

这里,我们使用默认构造函数User()创建一个新的User对象,然后调用setUsername()方法在用户对象上设置username为"john_doe"。最后,我们使用断言来验证username已正确设置。

3. 使用构造函数

构造函数是特殊的方法,用于初始化对象当创建一个类的对象时,它们会被调用。构造函数也可以用于设置实例变量的初始值。构造函数的一个显著特点是它们允许初始化final实例变量,确保这些值在整个对象生命周期中保持不变。

让我们看一个代表电子商务系统中产品的Product类的实际例子:

public class Product {
    private String name;
    private double price;
    private String category;

    public Product(String name, double price, String category) {
        this.name = name;
        this.price = price;
        this.category = category;
    }

    // Other methods...
}

在这个例子中,Product类表示电子商务系统中可供销售的产品。Product(String name, double price, String category)构造函数初始化产品的namepricecategory。通过使用构造函数,我们可以确保产品的重要信息,如名称、价格和类别,在对象创建时就已设定。

要使用构造函数创建具有特定细节的Product对象:

@Test
void givenProductDetails_whenCreatingProductWithConstructor_thenProductHasCorrectAttributes() {
    Product product = new Product("Smartphone", 599.99, "Electronics");
    assertEquals("Smartphone", product.getName());
    assertEquals(599.99, product.getPrice(), 0.001);
    assertEquals("Electronics", product.getCategory());
}

这里,我们使用构造函数Product(String name, double price, String category)直接在创建对象时传递产品的名称、价格和类别作为参数。

4. 选择setter方法与构造函数

在setter方法和构造函数之间做出选择时,请考虑以下指导原则:

使用setter方法

使用构造函数

当变量的值可能会随时间变化

当初始化不可变属性

当在设置值之前需要验证或附加逻辑

当确保某些值在对象创建时设置

当在对象初始化后设置值

当变量的值在初始化后不应更改

5. 总结

总之,setter方法和构造函数都是Java中设置变量值的关键工具。通过理解本文介绍的区别和指导原则,开发者能够明智地决定何时有效地使用setter方法或构造函数。

如往常一样,相关的源代码可以在GitHub上找到。